...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字节的存储空间,也有一个地址与之对应

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com