C语言刷题(17)

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; //看看找不找得到
}

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值