...inta [5][5]; int (*p)[4]; p=(int(*)[4])a; &p[4][2] - &a[4...
发布网友
发布时间:2024-10-24 18:54
我来回答
共1个回答
热心网友
时间:2024-11-01 01:34
这是在考你对数组指针(行指针)以及二维数组强制类型转换成含指针的认识
对于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字节的存储空间,也有一个地址与之对应