目录
10、指针笔试题
1.第一题
2.第二题
3、第三题
4、第四题
5、第五题
6、第六题
7、第七题
8、第八题
int main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&arr+1);
printf("%d %d",*(a+1),*(ptr-1));
return 0;
}
解释:
&a是代表整个数组的地址,&a的类型是int(*)[5],&a+1跳过一个数组的大小。
struct Test
{
int Num;
char *pcName;
short sDate;
char cha[2];
short SBa[4];
}*p;
//假设p的值为0x100000,如下表达式的值分别为多少?
//这个结构体20个字节
int main()
{
printf("%p\n",p+0x1);
printf("%p\n",(unsigned long)p+0x1);
printf("%p\n",(unsigned long *)p+0x1);
return 0;
}
解释:
(1)p+0x1:一个结构体指针+1跳过一个结构体。
0x100000+20
=0x100014
(2)(unsigned long)p+0x1:整型+1
0x100001
(3)(unsigned long*)p+0x1:指针+1,跳过一个unsigned long*类型的大小就是4个字节
0x100004
int main()
{
int a[4]={1,2,3,4};
int *ptr1=(int *)(&a+1);
int *ptr2=(int *)((int)a+1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
解释:
ptr1:(&a+1)跳过一个数组的大小
ptr2:(int)a+1,强制类型转换成int,变成了整数+1
ptr1[-1]:相当于*(ptr1-1);
因此答案为4 2000000
int main()
{
int a[3][2]={(0,1),(2,3),(4,5)};
int *p;
p=a[0];
printf("%d",p[0]);
return 0;
}
解释:
逗号表达式:从左向右依次计算
a[0]代表二维数组第一行的地址
p是二维数组第一行的地址
p[0]就是第一行第一个的元素的值
因此答案为1
int main()
{
int a[5][5];
int (*p)[4];
p=a;
printf("%p,%d\n",&p[4][2]-&a[4][2],&p[4][2]-&a[4][2]);
return 0;
}
答案:FFFFFFFC -4
第一个打印的是补码。
int main()
{
int aa[2][5]={1,2,3,4,5,6,7,8,9,10};
int *ptr1=(int *)(&aa+1);
int *ptr2=(int *)(*(aa+1));
printf("%d %d",*(ptr1-1),*(ptr2-1));
return 0;
}
解释:
&aa+1跳过一个数组,*(aa+1)是跳过一行。
因此答案是 10,5
int main()
{
char *a[]={"work","at","alibaba"};
char **pa=a;
pa++;
printf("%s\n",*pa);
return 0;
}
因此答案是at
int main()
{
char *c[]={"ENTER","NEW","POINT","FIRST"};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp=cp;
printf("%s\n",**++cpp);
printf("%s\n",*--*++cpp+3);
printf("%s\n",*cpp[-2]+3);
printf("%s\n",cpp[-1][-1]+1);
return 0;
}
解释:
因此第一个打印的是POINT
(2)*--*++cpp+3
由于第一个printf函数中,cpp发生了改变,因此cpp指向cp的第二个也就是上面图像中箭头所指的部分。
图从左向右读,因此答案是ER
(3)*cp[-2]+3
答案是ST
(4)cpp[-1][-1]+1
答案是EW
cpp[-1][-1]--->*(*(cpp-1)-1)