1. 下面哪个是函数指针?( )
A.int* fun(int a, int b);
B.int(*)fun(int a, int b);
C.int (*fun)(int a, int b);
D.(int *)fun(int a, int n);
答案解析:
ABD没有区别,加的括号没有影响任何优先级,都是返回值为int *的函数,故选C。
2. 定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?下面哪个是正确的?( )
A.int (*(*F)(int, int))(int)
B.int (*F)(int, int)
C.int (*(*F)(int, int))
D.*(*F)(int, int)(int)
答案解析:
D类型不完整先排除,然后看返回值,B的返回值是int,C的返回值是int *,故选A。判断返回值类型只需要删掉函数名/函数指针和参数列表再看就行了。int (*(*F)(int, int))(int)删掉(*F)(int, int)后剩下int (*)(int),符合题意。
3. 在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,下面哪个是:一个参数为int *,返回值为int的函数指针( )
A.int (*fun)(int)
B.int (*fun)(int *)
C.int* fun(int *)
D.int* (*fun)(int *)
答案解析:
首先C压根就不是函数指针,先排除,然后D返回值不是int,排除,A的参数不是int *,排除,剩下B了。
4. 声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是( )
A.(int *p[10])(int*)
B.int [10]*p(int *)
C.int (*(*p)[10])(int *)
D.int ((int *)[10])*p
答案解析:
A选项,第一个括号里是一个完整定义,第二个括号里是个类型,四不像。BD选项,[]只能在标识符右边,双双排除。只有C是能编过的。
5. 设有以下函数void fun(int n,char *s){……},则下面对函数指针的定义和赋值均是正确的是:( )
A.void (*pf)(int,char); pf=&fun;
B.void (*pf)(int n,char *s); pf=fun;
C.void *pf(); *pf=fun;
D.void *pf(); pf=fun;
答案解析:
CD前半句压根就不是定义而是声明,A选项参数列表的第二个参数错了。应为char *,B选项正确。需要说明的是,对于函数名来说,前面的&和*都会被忽略,所以fun前面加不加取地址都没区别。只有定义出的函数指针变量(如题面中的pf)加上&后才会变成二级函数指针。
7. 字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋 答案解析:一个字符得到DAABC
答案解析:
#include<stdio.h>
#include<string.h>
int judgmentlr(char arr[], char arr2[]) {
int sz = sizeof(arr) / sizeof(arr[0]);
for (int i = 1; i <= sz; i++)
{
for (int j = i; j <= sz - 1; j++)
{
char* lr = &arr[j];
lr++;
for(int k=0;k<i;k++){
char* lr = &arr[k];
lr++;
}
if (strcmp(lr, arr2) == 0)
{
return 1;
}
}
for (int j = sz-1; j >= sz - i ; j--)
{
char* lr = &arr[j];
lr++;
for (int k = 0; k < sz - i; k++) {
char* lr = &arr[k];
lr++;
}
if (strcmp(lr, arr2) == 0)
{
return 1;
}
}
}
return 0;
}
int main()
{
char a1[] = "ABCD";
char a2[] = "DABC";
int a = judgmentlr(a1, a2);
printf("%d",a);
return 0;
}