函数指针
1. 下面哪个是函数指针
A.int* fun(int a, int b);//函数声明
B.int(*)fun(int a, int b);//等价于A,()无意义
C.int (*fun)(int a, int b);//函数指针
D.(int *)fun(int a, int n);//同A
定义一个函数指针,指向的函数有两个int形参并且返回一个函数指针,返回的指针指向一个有一个int形参且返回int的函数?下面哪个是正确的?
A.int (*(*F)(int, int))(int)//正确
B.int //函数指针 :(*F)(int, int)
C.int (*(*F)(int, int))
D.*(*F)(int, int)(int)
// 简化代码:
typedef int (*pf_t)(int);
==>pf_t (*p)(int);
在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,下面哪个是:
一个参数为int *,返回值为int的函数指针( )
A.int (*fun)(int)
B.int (*fun)(int *)//
C.int* fun(int *)
D.int* (*fun)(int *)
声明一个指向含有10个元素的数组的指针,其中每个元素是一个函数指针,该函数的返回值是int,参数是int*,正确的是( )
//数组指针,指向的数组10个元素,每个元素是函数指针
int (*p)(int*)
A.(int *p[10])(int*)
B.int [10]*p(int *)
C.int (* (*p)[10] )(int *)
//指针
D.int ((int *)[10])*p
设有以下函数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;
2. 空心正方形图案
输入描述:
多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“*”的数量。
输出描述:
针对每行输入,输出用“”组成的“空心”正方形,每个“”后面有一个空格。
实心版本
int main()
{
int n = 0;
while (scanf("%d", &n) == 1)
{
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("* ");
printf("\n");
}
}
return 0;
}
空心版本
int main()
{
int n = 0;
while (scanf("%d", &n) == 1)
{
int i = 0;
int j = 0;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == 0 || i == n - 1 || j == 0 || j == n - 1)
printf("* ");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
3. 有序序列插入一个数
描述
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。
输出描述:
输出为一行,N+1个有序排列的整数。
对数组只遍历一次
int main()
{
int n = 0;
scanf("%d", &n);
int arr[n + 1];//C99变长数组
int i = 0;
//输入n个数字
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
int k = 0;
scanf("%d", &k);
//插入
int j = n - 1;
for (; j >= 0; j--)
{
if (arr[j] > k)
arr[j + 1] = arr[j];
else
break;
}
arr[j + 1] = k;
for (j = 0; j < n + 1; j++)
printf("%d ", arr[j]);
return 0;
}