通过knr,我已经达到了多维数组。
我想知道几件事:
首先
假设我初始化以下数组
int a[2][4] = {{1,2,3},{4,5,6}};
现在,我理解为将2个4 * sizeof(int)字节的连续内存放在一边。好吧,所以在我看来它只是一个很好的方式来预留多重定义的内存。所以...为什么以下不正确:
int a[8] == int[2][4]
其次,当我走的时候,
int a[2][3] = {{1,2,3},{2,3,4}};
为什么这次尝试失败
a[5] = 22;
那么,如果它不仅仅是一个连续的内存块,那么多维数组是什么?
答案 0 :(得分:0)
T a[x][y][z];
a
是一个数组(x
个元素)数组(每个y
个元素)数组{{每个z
个元素)T
}。
<强>更新强>:
如上定义的数组确实是连续的内存块。
然而,看到像这样的行
T t = b[0][0[0];
不知道如何定义a
并不一定意味着b
是一个连续的内存块,通过索引b
在3个维度中保存所有元素。
阵列可以分散。
例如
T ** c1 = malloc(x * sizeof(*c1));
for (size_t i = 0; i < x; ++i)
c1[i] = malloc(y * sizeof(**c1));
允许您以与使用
相同的方式访问c1
的{{1}} * x
个元素
y
T c2[x][y];
个元素存储在一个连续的内存区域中,而c2
个元素分散在c1
个大小为x
的区域中,并附加一个大小的内存块y
与c1
的大小相比x * sizeof(*c1)
。
答案 1 :(得分:0)
如果您有[a] [4]并尝试访问[1],则a [1]为 int [] ,而不是 int 强>
换句话说,[1]是一个数组,而[1] [1]是一个整数值。
你需要施展才能做你想做的事。
答案 2 :(得分:0)
多维数组 只是一块连续的内存块。但是,当您声明一个变量时,编译器希望您在声明它时使用该变量。因此,如果您将a
声明为带有
int a[2][4] = {{1,2,3},{4,5,6}};
然后编译器将变量a
视为二维数组。
如果您想将该数组作为一维数组访问,那么您需要声明另一个变量,例如
int *b = (int *)a;
然后您可以使用类似
的代码访问数组的元素 for ( i = 0; i < 8; i++ )
printf( "%d %d\n", i, b[i] );
,输出将是
0 1
1 2
2 3
3 0
4 4
5 5
6 6
7 0
注意位置3和7处的零。这些元素为零,因为数组的每一行都声明为包含4个项目,但初始化程序每行只有3个项目。初始化程序中的任何未指定的项都用零填充。