1、下面代码关于数组名描述不正确的是( )
int main()
{
int arr[10] = {0};
return 0;
}
A.数组名arr和&arr是一样的
B.sizeof(arr),arr表示整个数组
C.&arr,arr表示整个数组
D.除了sizeof(arr)和&arr中的数组名,其他地方出现的数组名arr,都是数组首元素的地址。
答案解析
A选项错误明显。arr的类型是int [10],而&arr的类型是int (*)[10],根本不是一个类型,
不可能是一样的。而在 sizeof(arr)和&arr中,arr都是看成整体的,而一般它代表一个数组
的首地址。
2、下面哪个代码是错误的?( )
#include <stdio.h>
int main()
{
int *p = NULL;
int arr[10] = {0};
return 0;
}
A.p = arr;
B.int (*ptr)[10] = &arr;
C.p = &arr[0];
D.p = &arr;
答案解析
就数据类型来看,A左右两边都是int *,B左右两边都是 int (*)[10],C左右两边
都是int *,D左边是 int *,右边是 int (*)[10],故选D。
3、下面哪个是函数指针?( )
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。
4、设有以下函数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前面
加不加取地址都没区别。
5、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针
来实现这一功能,下面哪个是:一个参数为int *,返回值为int的函数指针( )
A.int (*fun)(int)
B.int (*fun)(int *)
C.int* fun(int *)
D.int* (*fun)(int *)
答案解析
首先C压根就不是函数指针,先排除,然后D返回值不是int,排除,A的参数不是int *,
排除,剩下B了。
6、定义一个函数指针,指向的函数有两个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),符合题意。
7、声明一个指向含有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是能编过的。
8、字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
参考答案
本题当然可以将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,
也太费事,但是这题有一个很简单的做法:
其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
所以做法很简单,只需要将原字符串再来一遍接在后面,然后找一找待查找的字符串是不是
两倍原字符串的子集即可。
int findRound(const char * src, char * find)
{
char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串
strcpy(tmp, src); //先拷贝一遍
strcat(tmp, src); //再连接一遍
return strstr(tmp, find) != NULL; //看看找不找得到
}