题六
#include <stdio.h> 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)); //aa代表首元素地址即aa[0]的地址,+1就是a[1]的地址 printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1)); return 0; }
输出:10,5
不多解释了
题七
#include<stdio.h> int main() { char* a[] = { "work","at","alibaba" }; char** pa = a; pa++; printf("%s\n", *pa); return 0; }
输出:at
分析:a[0]存放‘w’的地址,a[1]存放‘a’的地址,a[2]存放‘a’的地址,如图(两个a地址不同,由首字符地址可以找到该字符串)
pa++,原来pa指向a[0],现在指向a[1],解引用得到a[1]的内容即地址,打印字符串得到 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; }
输出:
相信大家应该都有所疑惑吧,下面我们来分析一下:
char* c[] = { "ENTER","NEW","POINT","FIRST" };
由该代码可以画出下图:
char** cp[] = { c + 3,c + 2,c + 1,c }; char*** cpp = cp;
由此又可以得到下图:
printf("%s\n", **++cpp);
cpp先++,再解引用,++就改变了cpp里存放的地址,使原本指向cp[0]的指针++变为指向cp[1],如图:
解引用得到c[2]的地址,解引用得到字符‘P’的地址,打印就是:POINT
printf("%s\n", *-- * ++cpp + 3);
cpp在原来基础上再++,如图:
cpp解引用得到cp[2],–cp[2]就是将cp[2]里的地址–,所以cp[2]里地址指向了c[0],如图。解引用得到的地址指向字符‘E’,加3个字节就指向了字符E,打印字符串为ER
printf("%s\n", *cpp[-2] + 3);
经由几次++后,cpp指向cp[2] ,cpp[-2]可以写出*(cpp-2) ,得到cp[0],也就是c[3]的地址,再解引用得到字符‘F’的地址,加3得到‘S’的地址,打印字符串得到 ST
printf("%s\n", cpp[-1][-1] + 1);
cpp[-1][-1] 可以写成*(*(cpp-1)-1) ,cpp-1得到cp[1]的地址,解引用得到c[2]的地址,再-1得到c[1]的地址,解引用得到字符‘N’的地址,加一字节,得到字符‘E’的地址,打印字符串,得到EW
好了关于指针的系列就告一段落了,相信大家应该收获满满吧,下期见了~