1、请解释“func”为何种类型,这种类型的作用什么,变量ttt 的值是多少?
typedef int (*func)(int, int*);//函数指针------回调函数-----7
int xxx(int a, int *p)
{
return a + *p;
}
int dowork(func aaa, int bbb, int *ccc)
{
return aaa(bbb, ccc);
}
int sss = 4;
int ttt = dowork(&xxx, 3, &sss);
2、若有定义inta[3][3],有哪几种方式可以表示a[1][1]。
*(&a[0][0]+4)
*(*(a+1)+1)
*(a[1]+1)
3、用变量a给出下面的定义
a) 一个整型数(An integer) int a;
b) 一个指向整型数的指针(A pointer to an integer) int *a;
c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer) int **a;
d) 一个有10个整型数的数组(An array of 10 integers) int a[10];
e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers) int *a[10];
f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers) int (*a)[10];
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)
Int (*fun)(int );
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )int (*a[10])(int );
4、 int a=12; int*p,*q,*r;
p=&a;
r=p+1;
q=p++;
printf(“%2d%2d\n”,q-p,r-p);
printf(“%5d\n”,(char*)p-(char*)q);
输出结果是多少?-1,0,4
5、下面程序执行的结果?为什么会是这个结果?
int main()
{
char a[1000];
int i;
for(i = 0; i < 1000; i++)
{
a[i] = -1-i;
}
printf(“%d\n”, strlen(a));
return 0;
}255
快速求补码:从右到左找到第一个不为0的位,从这个位开始(不包含这个位),从右到左前面的位0变1,1变0,不包含符号位。
i=0 a[i]=-1; 原码:0x1000 0001 补码:0x1111 1111
i=1 a[i]=-2; 原码:0x1000 0010 补码:0x1111 1110
i=2 a[i]=-3; 原码:0x1000 0011 补码:0x1111 1101
i=127 a[i]=-128; 原码:0x11000 0000 补码:0x11000 0000
i=128 a[i]=-129; 原码:0x11000 0001 补码:0x10111 1111
i=129 a[i]=-130; 原码:0x11000 0010 补码:0x10111 1110
i=254 a[i]=-255; 原码:0x11111 1111 补码:0x10000 0001
i=255 a[i]=-256; 原码:0x110000 0000 补码:0x110000 0000
6、Int main{
Char a[5] = {‘A’,’B’,’C’,’D’};
Char (*p1)[5] = &a;指向整个数组的指针
Char (*p2)[5] = a;指向单个字符的指针
Return 0;
}
问题: 1.p1和p2 的使用,哪个正确?
2、P1+1的值会是什么? P2+1的值是什么?
7、请问下面程序有什么错误?
int a[60][250][1000],i,j,k;
for(k=0;k<=1000;k++)
for(j=0;j<250;j++)
for(i=0;i<60;i++)
a[i][j][k]=0;
交换最内层和最外层的for循环的顺序,减少程序的执行的次数,节省资源
8、数组定义为“ int a [ 4 ] ; ”,表达式 ( ) 是错误的。
A.*a
B.a [ 0 ]
C.a
D.a++ 常量不能自增
9、打印一个N*N的方阵,N为每边字符的个数( 3〈N〈20 ),要求最外层为“X”,第二层为“Y”,从第三层起每层依次打印数字0,1,2,3,...
例子:当N =5,打印出下面的图形:
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X
10、已知一个数组table,用一个宏定义,求出数据的元素个数。
#define NUM(a) while(*a != ‘\0’) count++;
#define NUM (sizeof(table)/sizeof(table[0]))
11、若定义:int a[2][3]= {0,2,4,6,8,10},以下说法正确的是:
A、*(a + 1)为元素6的地址
B、*(a[1] + 1)的值为2
C、a[0]与a相同
D、**(a+1)+2的值为8
E、a[1][2]的值为10
12、用函数指针实现a,b中取最大值
13、函数指针有什么作用
函数指针本质上就是一个指针,这个指针带返回值和参数类型,指针指向一个函数入口地址,c语言中,函数名就是函数的入口地址;函数指针也是一种数据类型:int (*func)(int ,int );
14、指针在任何情况下都可以进行> ,< ,<=,>=,==运算,这句话对不对?
指针是一个特殊的变量,它里面存储的数值被解释为内存里的一个地址,可看成一个无符号整型变量,如果是指针比较就可看成整型变量比较,是可以比较的,关键看比较是否有意义;
(1)不同类型的指针不强制转换没有意义;
(2)没有意义的指针(没初始化的指针)没有意义;
(3)一般在不同存储区域(栈、堆、静态区)没有意义;
15、设int arr[] = {6,7,8,9,10}
Int *ptr = arr;
*(ptr++)+ = 23;
*ptr =? *(++)ptr = ?//8 8
17、下列程序的运行结果是( )
main( )
{ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i=2,j=1;
p=a;
printf(″%d\n″,*(*(p+i)+j));
}
A.9 B.11 C.17 D.19
18、 Char* pa[3] = {“ABC”,”DEF”,”GHI”};
Char** p = pa;
p ++;
printf(“%s\n”,p);
打印结果是什么?
打印结果为乱码,如果是printf(“%s\n”,*p);打印为DEF;如果是printf(“%c\n”,**p);打印为D;
19、int a[5]; 假设a的首地址是0xff15;
求 a+1 &a+1 &(a+1) sizeof(a)/sizeof(int)
0xff19 0xff29 0xff19 5