关于数组指针的问题 inta [5][5]; int (*p)[4]; p=(int(*)[4])a; &p[4][2] - &a[4][2]为什么会是-4?

#include <stdio.h>
int main()
{
int a[5][5];
int (*p)[4];
p=(int(*)[4])a;
printf("%d\n", (&p[4][2] - &a[4][2])); //对指针取地址是个啥,不理解这个操作
return 0;
}

对p[4][2]取地址后是个啥?不理解这个操作~谁能帮忙解释下吗?

这是在考你对数组指针(行指针)以及二维数组强制类型转换成含指针的认识

对于int (*p)[4]这个指针p它所指的内容应该是这样的:
X X X X

X X X X
X X X X
X X X X
X X X(p[4][2]) X

....................

X X X X

即指向一片二维数组,该二维数组行数不定,列数为4
上面我已经标注了p[4][2]的位置了(偏离首元素位置为18-------从0 开始算的)

把二维数组强制类型转换成(*p)[4]的过程就是把数组a所在的内存数据看成是行指针所指数据,换句话说就是直接把p指向了a的区域(事实上强制转换什么都没做)

下面 对于数组a
很简单 a[4][2]偏离首元素位置为22
所以得到的答案是:(18-22)=-4
(注意,取地址取出来的两个实际值相减,减出来的答案是-16,但这里是根据int类型来计算的,得到的答案是以int长度为单位计算的,对)

另外,对于
printf("%d\n", (&p[4][2] - &a[4][2])); //对指针取地址是个啥,不理解这个操作

我告诉你p[4][2]并不是指针,而是数组的一个元素,这取地址有何不可?
再说,即使是指针,也是可以取地址的
在32位机器上,指针也占据着4字节的存储空间,也有一个地址与之对应
温馨提示:答案为网友推荐,仅供参考