它只是一个随机的设计选择,还是有任何特定的原因,C支持行主要而不是列主要?我知道Fortran使用专业列.那么这些设计选择背后的原因(如果有的话)是什么?
基于对问题的一些评论以及其他一些答案(以及我自己的一些反思 - 但特别是对C语言设计过程没有任何了解......)我的答案,我相信这是一个基于仅仅的选择做出这个决定的人(里奇?)需要自己做什么.
如果将多维数组的索引解释为矩阵索引,则将第一个索引作为行索引而将第二个索引作为列索引(即列主要结构)是有意义的.如果你的应用程序在线性代数或其他重量级的计算上很重要,那么以一种方式存储这些结构也是有意义的,这样可以一次一行地遍历它们,因为许多算法都是这样做的.出于这个原因,Matlab和Fortran等编程语言受益于列专业 - 它使编写高效代码时更容易编写矩阵和矩阵算法.
另一方面,C比Matlab或Fortran更通用.如果你不打算int**专门用于矩阵,那么哪个索引并不重要.并且看起来很自然,如果a是a int**,则a[2]返回an int*并a[2][1]返回int- 你"深入挖掘"到多维数组中.为了提高效率,我们现在只关心如果我们选择a[2]并想要迭代它,它应该有效地缓存.程序员是否a[2]与矩阵行或矩阵列相关联并不重要- 我们不使用矩阵!
因此,没有强有力的案例(我可以说是我的头脑中),因为C是专栏.在实现第一个版本时,它可能更容易使它成为行主 - 也许是因为底层的低级语言(汇编程序?)已经是行主要的 - 就是这样.
C 只定义了数组,并且允许数组的元素也可以是数组。对于数组数组,第一个索引选择数组元素,第二个索引选择该数组中的值元素。如果颠倒它们的含义就会产生不合逻辑的语法。
\n\n对于某些二维矩阵数据结构,将第一个索引解释为行号,将第二个索引解释为列号只是一种解释。
\n\n请注意,Fortran 的(列主)数组不是通过应用两个单独的索引运算符来索引的。
\n\n编辑:为了给出权威的引用,C 标准在 \xc2\xa76.5.2.1 (C99) 中说,在解释了下标多维数组的结果如何是一个 n-1 维数组之后
\n\n\n\n\n由此可见,数组是按行优先顺序存储的
\n
(强调我的)
\n