#include
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

实际上的结果也符合预期
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯