为什么C语言不支持列主阵列?

Sre*_*Das 9 c

它只是一个随机的设计选择,还是有任何特定的原因,C支持行主要而不是列主要?我知道Fortran使用专业列.那么这些设计选择背后的原因(如果有的话)是什么?

Tom*_*han 8

基于对问题的一些评论以及其他一些答案(以及我自己的一些反思 - 但特别是对C语言设计过程没有任何了解......)我的答案,我相信这是一个基于仅仅的选择做出这个决定的人(里奇?)需要自己做什么.

如果将多维数组的索引解释为矩阵索引,则将第一个索引作为行索引而将第二个索引作为列索引(即列主要结构)是有意义的.如果你的应用程序在线性代数或其他重量级的计算上很重要,那么以一种方式存储这些结构也是有意义的,这样可以一次一行地遍历它们,因为许多算法都是这样做的.出于这个原因,Matlab和Fortran等编程语言受益于列专业 - 它使编写高效代码时更容易编写矩阵和矩阵算法.

另一方面,C比Matlab或Fortran更通用.如果你不打算int**专门用于矩阵,那么哪个索引并不重要.并且看起来很自然,如果a是a int**,则a[2]返回an int*a[2][1]返回int- 你"深入挖掘"到多维数组中.为了提高效率,我们现在只关心如果我们选择a[2]并想要迭代它,它应该有效地缓存.程序员是否a[2]与矩阵行或矩阵列相关联并不重要- 我们不使用矩阵!

因此,没有强有力的案例(我可以说是我的头脑中),因为C是专栏.在实现第一个版本时,它可能更容易使它成为行主 - 也许是因为底层的低级语言(汇编程序?)已经是行主要的 - 就是这样.

  • 我认为在某种程度上它确实很重要.`int [n] [m]`非常像一个密集矩阵,而`k [i] [j]`通过取'(i*m + j)`-th`int`大小的单元格来取消引用.`int**`是指向指针的指针,因此`[i] [j]`涉及解除引用两个指针.后者与行或列主要无关,但前者正是行主要(或者:第一个索引中的主要部分,而不是最后一个)的含义. (2认同)

Cub*_*bbi 1

C 只定义了数组,并且允许数组的元素也可以是数组。对于数组数组,第一个索引选择数组元素,第二个索引选择该数组中的值元素。如果颠倒它们的含义就会产生不合逻辑的语法。

\n\n

对于某些二维矩阵数据结构,将第一个索引解释为行号,将第二个索引解释为列号只是一种解释。

\n\n

请注意,Fortran 的(列主)数组不是通过应用两个单独的索引运算符来索引的。

\n\n

编辑:为了给出权威的引用,C 标准在 \xc2\xa76.5.2.1 (C99) 中说,在解释了下标多维数组的结果如何是一个 n-1 维数组之后

\n\n
\n

由此可见,数组是按行优先顺序存储的

\n
\n\n

(强调我的)

\n

  • 是的,但这并不能回答任何问题。 (8认同)