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]