第六题
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; } //答案: 10 5
第一个答案: &aa得到的是整个数组的地址+1就是跳过了整个数组所以ptr1指向数组后第一个元素-1后就指向10.
第二个答案: 我们对二维数组解引用时为了精准到元素是要两次解引用的, 如果只一次解引用就会得到行数组的首元素地址+1就跳过一行所以第二个答案是5
对第二个答案的详解: 对于二维数组来说哪aa举例我们要使用它时格式为aa[1][2] = 8其实aa[1][2] 和*(*(aa+1)+2) 而我们ptr2中*(aa+1)就是跳过了一行所以我们的ptr2就指向了第二行的首元素及指向6所以第二个答案为5.
第七题
#include <stdio.h> int main() { char *a[] = {"work","at","alibaba"};//指针数组 char**pa = a; pa++; printf("%s\n", *pa); return 0; } //答案: at
解析: a作为指针数组每个元素都指向一个字符串二级指针pa指向a的首元素pa++后指向第二个元素及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 ER ST EW
这道题比较难大家要耐心看解析
解析
第一个答案: ++cpp指向c+2 为"POINT"(cpp值已经发生了改变)
第二个答案: 优先级和指针的重复考察首先优先级 : ++ * 和 – 为一个等级 +3是等级最低我们结合性是从左到右首先++ 我们的cpp就指向了cp数组中的c+1然后解引用就为c+1后–;c+1就成了c(注cp数组里的c+1就变成了c了)就指向首元素地址了然后再解引用为c首元素地址ENTER再+3 就指向ENTER中的E用字符串形势打印就成了ER.
第三个答案: 中cpp已经指向了cp中的第三个元素(现在是c而不是c+1),所以cpp[-2]就是cp中的首元素c+3 再次解引用后就是FIRST 再+3后指向了S打印后就是ST
(cpp[-2]等价与*(cpp-2)现在的cpp没有改变).
第四个答案: cpp[-1][-1]相当于*(*(cpp-1)-1) 原本cpp指向cp中的第三个元素-1后解引用就是第二个c+2再-1 后解引用就是c+1的元素指向NEW的指针最后再+1就是指向E用字符串打印后就是EW.