C语言指针典型题(2)
题目六
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
解析
这是一个字符指针数组,数组的每个元素的是字符指针,所以a就是第一个字符指针的地址,想要存储指针的地址,就需要使用二级指针。
pa++,就是第二个指针的地址
解引用出来就是第二个元素,之后联系字符指针的特殊用法,就可以解引用出来就是"at"这个字符串。
答案
at
题目七
#include <stdio.h>
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;
}
解析
这个题很难!
1.cpp存储的是(c + 3)的地址,所以++后,是(c + 2)的地址,两次解引用,就是c[2],也就是point。
2.cpp此时是(c + 2)的地址,再++后是(c + 1)的地址,解引用一次变成(c + 1),再–,也就变成了c,*c等于指向第一个字符串首字符的指针,所以加3变成ER
3.cpp[-2] = c + 3,之后就是指向FIRST字符串首字母的指针,最后ST
4.cpp[-1][-1] + 1就是指向NEW字符串首字母的指针,最后是EW
答案
POINT
ER
ST
EW