c语言编程中的三维阵列 #包括 int main() { int a[2][3][2]={{{1,2}、{3,4}、{5,6}、{{5,8}、{9,10}、{11,12}; printf(“%d\n%d\n%d\n”,a[1]-a[0],a[1][0]-a[0][0],a[1][0][0]-a[0][0]); 返回0; }

c语言编程中的三维阵列 #包括 int main() { int a[2][3][2]={{{1,2}、{3,4}、{5,6}、{{5,8}、{9,10}、{11,12}; printf(“%d\n%d\n%d\n”,a[1]-a[0],a[1][0]-a[0][0],a[1][0][0]-a[0][0]); 返回0; },c,arrays,C,Arrays,输出为364。谁能给我解释一下原因吗?为什么a[1]-a[0]=3和a[1][0]-a[0][0]=6以及a[]和a[][如何在三维数组中进行解释?在地址点,a[1]和a[1][0]是相同的值。[0]和[0][0]是相同的值 但类型不同 [1][0]和[0][0]是int*,从[0][0]到[1][0],共有6个int 从[1]到[0],有3{x,y} [1][0][0]和[0][0][0]是int,a[1][0][0]-a[0][0]=5-1=4。如果您了解像您这样的数组在内存中的布局方式,可

输出为
364
。谁能给我解释一下原因吗?为什么
a[1]-a[0]=3
a[1][0]-a[0][0]=6
以及
a[]
a[][
如何在三维数组中进行解释?

在地址点,a[1]和a[1][0]是相同的值。[0]和[0][0]是相同的值

但类型不同

[1][0]和[0][0]是int*,从[0][0]到[1][0],共有6个int

从[1]到[0],有3{x,y}


[1][0][0]和[0][0][0]是int,a[1][0][0]-a[0][0]=5-1=4。

如果您了解像您这样的数组在内存中的布局方式,可能会有所帮助:

#include <stdio.h>

int main()
{
    int a [2][3][2]={{{1,2},{3,4},{5,6}},{{5,8},{9,10},{11,12}}};

    printf("%d\n%d\n%d\n",a[1]-a[0],a[1][0]-a[0][0],a[1][0][0]-a[0][0][0]);
    return 0;
}
+------------+低地址+-----------+低地址+------+ |a[0][0][0]| | a[0][0]| | a[0]| |a[0][0][1]| | | || |a[0][1][0]| | a[0][1]| || |a[0][1][1]| | | || |a[0][2][0]| | a[0][2]| || |a[0][2][1]| | | || |a[1][0][0]| | a[1][0]| | a[1]| |a[1][0][1]| | | || |a[1][1][0]| | a[1][1]| || |a[1][1][1]| | | || |a[1][2][0]| | a[1][2]| || |a[1][2][1]| | | || +------------+高位地址+-----------+高位地址+------+ 然后,它有助于了解您得到的差异是该类型的倍数。因此,对于
a[0]
a[1]
来说,类型是
int[3][2]
,在
a[0]
a[1]
之间有三个倍数

a[0][0]
a[1][0]
相同,类型为
int[2]
,并且
a[0][0]
a[1][0]
之间的差异为六个
int[2]
单位


详细说明一下:在
a[0]
a[1]
之间,您有
a[0][0]
a[0][1]
a[0][2]
。三个条目


a[0][0]
a[1][0]
之间有
a[0][0][0]
a[0][0][1]
a[0][1][1]
a[0][2][0]
a[0][2][1]
。六个条目。

在C中,多维数组在概念上是一个数组,其元素也是数组。因此,如果你这样做:

整数数组[2][3];从概念上讲,您最终会:

+------------+ Low address +---------+ Low address +------+ | a[0][0][0] | | a[0][0] | | a[0] | | a[0][0][1] | | | | | | a[0][1][0] | | a[0][1] | | | | a[0][1][1] | | | | | | a[0][2][0] | | a[0][2] | | | | a[0][2][1] | | | | | | a[1][0][0] | | a[1][0] | | a[1] | | a[1][0][1] | | | | | | a[1][1][0] | | a[1][1] | | | | a[1][1][1] | | | | | | a[1][2][0] | | a[1][2] | | | | a[1][2][1] | | | | | +------------+ High address +---------+ High address +------+ 整数数组[2][3][2]。。。将为您提供如下结构:

array[0] => [0, 1, 2]
array[1] => [0, 1, 2]
[1]-a[0]=>将给出单位类型的差异。[0]和[1]是int,它们之间有三个单位。第二部分也是如此

a[1][0]-a[0][0]=6


[0][0]和[1][0]之间的组合数为6。

请详细说明一下,指针的加减是多种类型的。例如,int*a=100;int*b=0;a-b=25,25*sizeof(int)请详细说明this@BakulMittal[0]和[0][0]是指针,因此,当用[1]和[1][0]对它们进行减法运算时,结果是两个内存位置之间的差值。[0][0][0]和[1][0][0]是数组中的值,因此当对它们进行减法运算时,会得到两个值之间的差值。请解释编译器如何通过addressing@BakulMittal请记住,数组自然衰减为指向其第一个元素的指针。因此,
a[0]
衰减为
&a[0][0]
。编译器正在做的是从
&a[1][0]
中减去
&a[0][0]
的指针,然后将差值除以类型的大小(即
int[3][2]
array[0] => [0] => [1, 2]
            [1] => [3, 4]
            [2] => [5, 6]
array[1] => [0] => [5, 8]
            [1] => [9, 10]
            [2] => [11, 12]