题目一
#include <stdio.h> 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; }
为了大家好理解 我画图解释下这一题
首先 我们画出a 这是一个二维数组
紧接着 就轮到p了 p是一个数组指针 它指向一个4个元素的数组
这是它们两个分别表示的位置
我们都知道 指针相减表示的是它们之间相差的元素 这里的元素相差是-4
-4 以%d的形式打印就是-4
而它在内存中储存的是补码 所以说打印形式是 fffffffc
题目二
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
如图
cp也是一个指针数组 里面有四个指针
如图
最后的ccp也是一个指针
指向的cp
第一个ccp++之后解引用 实际上指向了 c+2 再解引用打印出point
因为这个时候前缀++ 实际上ccp的位置改变了
第二题 首先对于ccp前缀++ 这个时候它的位置又改变了 变成了指向c+1
再对c+1进行–操作之后解引用这个时候它的值也改变了 变成了c
之后c+3 实际上从er开始了 打印出er
第三题
实际上是对于ccp-2之后解引用 再解引用 之后指针位置向后移动3
打印出来是st
第四题实际上是 *((ccp-1)-1)+1
打印出来ew
实际上的结果也符合预期
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯