【好题分享】适合C++初学者(函数指针)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨笨同学‍

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值