例题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;
}
由图知第二个打印的是-4
因为%p是直接将内存中的值当作地址打印
而-4在内存中存放的是其二进制的补码,打印以16进制形式打印
10000000000000000000000000000100 -4的原码
111111111111111111111111111111111011 -4的反码
111111111111111111111111111111111100 -4的补码
1111 1111 1111 1111 1111 1111 1111 1100
F F F F F F F C
所以第一个打印FFFFFFFC
例题2
int main()
{char* a[] = { "word", "at", "alibaba" };char** pa = a;pa++;printf("%s\n", *pa);//"at"
}
例题3
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;
}
先画图,根据此图去理解打印的内容。
对于第一个打印
对于第二个打印,不确定优先可以看看优先级
对于第三个打印
对于第四个打印
运行输出