我从一个朋友那里听说,C语言中的二维数组只在语法上被支持。
他告诉我最好使用float arr[M * N]而不是float[M][N],因为像gcc这样的C编译器不能保证在每个系统/平台上数据都在内存中连续存在。
我想在我的硕士论文中使用这个作为论点,但我没有任何参考。
所以第一个问题是:
他说的是真的吗?
第二个问题:
你知道在哪里有一本书或一篇文章可以找到这句话吗?
感谢+问候
发布于 2013-06-16 00:06:36
,
,
6.2.5类型?20
数组类型描述具有特定成员对象类型(称为element类型)的连续分配的非空对象集。
6.7.6.2数组声明符?3(注142)
当几个“数组”规范相邻时,将声明一个多维数组。
6.5.2.1数组下标»3
连续的下标运算符指定多维数组对象的元素。 ...由此可以得出,数组是以行为主的顺序存储的(最后一个下标变化最快)。
也许最明确的例子是6.5.2.1数组下标?4中的示例
示例考虑由声明定义的数组对象
int x[3][5];
这里,x int**s;是一个3x5的 int**s**.数组,更准确地说,x* 是一个由三个element对象组成的数组,每个element对象是一个由五个element对象组成的数组在表达式中,相当于`(((x)+(i))),xis first converted to a pointer to the **initial array of five** **int****s**. Theniis adjusted according to the type ofx, which conceptually entails multiplyingiby the size of the object to which the pointer points, **namely an array of five** **int** **objects**. The results are added and indirection is applied to **yield an array of five** **int****s**. When used in the expressionxi, that array is in turn converted to a pointer to the first of the ints, soxi`的x[i]会产生一个整数。
C中的多维数组就是“数组的数组”。它们工作得很好,并且100%由标准定义。
您可能还会发现阅读comp.lang.c常见问题解答中的Section 6, Arrays and Pointers会很有帮助。
发布于 2013-06-16 00:21:20
这个问题比其他答案听起来更微妙:
虽然多维数组(在语义上,可能不是物理上)是连续的,但只有当您停留在最初引用的数组的边界内时,才会定义指针算法(实际上,您可以超出上限1个元素,但只有在不取消引用的情况下)。
这意味着,语言语义禁止从头到尾遍历多维数组,而C语言的边界检查实现(原则上是可能的,但由于性能原因在野外很少见)可能会引发段错误,打印诊断信息,或者在您跨越子数组的边界时让恶魔从鼻子里飞出来。
我不确定编译器是否将此信息用于优化目的,但原则上,它们可以。例如,如果您有
float *p = &arr[2][3];
float *q = &arr[5][9];那么,无论x和y的值是什么,p + x和q + y都不应该有别名。
发布于 2013-06-16 00:10:55
6.2.5.20节要求数组是连续分配的。这不仅适用于一维数组,也适用于数组的数组。
你的朋友就是错了。
https://stackoverflow.com/questions/17125472
复制相似问题