未赋值四维数组a[6]-a[5]结果为20的原理请教
为什么
a[6] - a[5]的结果是20? 这是C语言数组隐式转换与指针减法规则共同作用的结果,拆解如下:
四维数组的结构本质:
int a[10][20][30][40]可以看作是「包含10个三维数组的数组」,每个三维数组的类型是int[20][30][40]——也就是每个三维数组里又包含20个二维数组(int[30][40]),以此类推。数组名的隐式指针转换:
在表达式中,数组名会自动转换为指向其第一个元素的指针:a[5]等价于*(a + 5):a先转为指向第一个三维数组的指针(类型int (*)[20][30][40]),a + 5指向第6个三维数组,解引用后得到该三维数组(类型int[20][30][40])。- 这个三维数组名再次转换为指针:指向它内部第一个二维数组的指针,类型为
int (*)[30][40]。同理,a[6]最终也会转为指向第7个三维数组内第一个二维数组的同类型指针。
指针减法的核心规则:
C语言中,同类型指针相减的结果是两者之间相差的元素个数,而非字节数。这里的「元素」指的是指针指向的类型对应的单元:- 当前指针指向的类型是
int[30][40](一个二维数组),每个这样的元素占用30*40*sizeof(int)字节。 a[5]到a[6]的总字节距离是一个完整三维数组的大小:20*30*40*sizeof(int)。- 用总字节数除以单个元素的字节数:
(20*30*40*sizeof(int)) / (30*40*sizeof(int)) = 20,这就是变量z的结果。
- 当前指针指向的类型是
验证小实验
如果强制转换为字节级指针再相减,就能看到实际的字节差:
#include <stdio.h> int main() { int a[10][20][30][40]; // 转换为char*后,减法结果是字节数 int z = (char*)a[6] - (char*)a[5]; printf("%d\n", z); // 若int占4字节,结果为20*30*40*4=96000 }
内容的提问来源于stack exchange,提问作者Creek
相关产品推荐
相关产品推荐

