C多维数组是否连续且无孔?
在C标准文档中,我找不到明确表示多维数组是连续的。虽然可以从以下事实推断,但我希望从社区的角度来看问题 下面的代码按照我期望的顺序打印出数字,即1-9C多维数组是否连续且无孔?,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,在C标准文档中,我找不到明确表示多维数组是连续的。虽然可以从以下事实推断,但我希望从社区的角度来看问题 下面的代码按照我期望的顺序打印出数字,即1-9 #include <stdio.h> int main() { int a[][3] = {{1,2,3},{4,5,6},{7,8,9}}; int* p = (int*)a; int i; for (i = 0; i < sizeof(a)/sizeof(int); i++)
#include <stdio.h>
int main()
{
int a[][3] = {{1,2,3},{4,5,6},{7,8,9}};
int* p = (int*)a;
int i;
for (i = 0; i < sizeof(a)/sizeof(int); i++)
printf("%d ",p[i]);
return 0;
}
#包括
int main()
{
int a[][3]={{1,2,3},{4,5,6},{7,8,9};
int*p=(int*)a;
int i;
对于(i=0;i
是的,可以通过归纳法获得。(作为一个建议,如果有帮助,请尝试将多维数组视为数组的数组。)
例如,考虑一个数组,如<代码> A[ 3 ] [ 3 ] < /代码> ./P>
- 因此,
、a[0][0]
和a[0][1]
是a[0][2]
的元素,它们是连续的a[0]
- 接下来,
和a[0]
是a[1]
的元素,因此它将是连续的a
a[0][2]
和a[1][0]
将彼此相邻,从而继续相邻
要获得更好的视觉效果,请参见下图
数组,比如说intarr[4][5]
,有四行,a[0]
,a[1]
,a[2]
和a[3]
,它们是连续的
现在,这些行中的每一行都有五列,如a[n][0]
,a[n][1]
,a[n][2]
,a[n][3]
,a[n][4]
,它们是连续的
因此,数组的所有元素(以及元素的元素)都是连续的
是的,它们是连续的。我想说的是,“数组”(即单数)是连续的,这意味着多维数组是连续的。根据
6.2.5类型p20:
数组类型描述了一组连续分配的非空对象,其中
特定的成员对象类型,称为元素类型。元件类型应为:
每当指定数组类型时完成
因此,所有数组类型(多维或非多维)都是连续分配的。C不显式地具有多维数组,C具有数组数组数组,并且C中的数组在内存中连续表示。因此,C中的所有数组都是连续的。因为多维数组是数组的数组,所以元素是连续的(我认为)。它们最好是——用单个数组处理二维数组是一种相当常见的习惯用法,而不是嵌套for循环。如果不是这样,所有这些代码都将被破坏。类型为z
的数组[x][y]
保证只占用(x*y*sizeof(z))。请注意,sizeof(z)
并不是在所有情况下都保证只占用类型所需的最大位数-例如,它可以更大,并且在某些CPU上的sizeof(char)
,可以超过8。@tofronit:sizeof(z)*x*y
比x*y*sizeof(z)
具有各种类型的x的优势,y
@chux抱歉,但那条评论对我来说没有多大意义。@Johncolman抱歉,我想确保新来者理解C没有多维数组,它有数组数组。@Blatter什么才算是“真正的”多维数组?实际上C标准多次提到多维数组,包括,例如,第§6.7.6.2章中的脚注142:“当多个“数组”规范相邻时,将声明一个多维数组。”@user694733你说得对,我完全忽略了这一点。我相信他可能指的是模拟MD阵列,就像C中的“通过引用”一样。谢谢你的确认。这是我的想法。