Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C编译器中的列主数组存储_C_Visual C++_Gcc_Clang_Icc - Fatal编程技术网

C编译器中的列主数组存储

C编译器中的列主数组存储,c,visual-c++,gcc,clang,icc,C,Visual C++,Gcc,Clang,Icc,是否有任何C编译器具有扩展以列主顺序而不是标准行主顺序存储数组?简短的回答是“否” 很长的答案是,按列主顺序存储数组将打破数组索引操作和指针算术之间的一对一对应关系,以及将N维数组切片为n1维数组的方式 考虑以列主顺序存储的10x20数组。这意味着相邻列中的单元将在内存中彼此相邻。另一方面,将指向i,j处数组元素的指针转换为元素指针的工作方式必须如下所示: int *p=&a[1][5]; int *q=&a[1][6]; p++; 标准要求p等于q,因为两个指针指向相邻的元素

是否有任何C编译器具有扩展以列主顺序而不是标准行主顺序存储数组?

简短的回答是“否”

很长的答案是,按列主顺序存储数组将打破数组索引操作和指针算术之间的一对一对应关系,以及将N维数组切片为n1维数组的方式

考虑以列主顺序存储的10x20数组。这意味着相邻列中的单元将在内存中彼此相邻。另一方面,将指向i,j处数组元素的指针转换为元素指针的工作方式必须如下所示:

int *p=&a[1][5];
int *q=&a[1][6];
p++;
标准要求p等于q,因为两个指针指向相邻的元素。如果数组a以列主顺序存储,则不可能实现此操作


在C语言中,您必须编写自己的函数集才能使用这样的数组。但是,如果你用C++来编码,你就有一个选项来实现你自己的多维数组,并将括号运算符()重载到一个列的主要顺序。不清楚。他想要一个FORTRAN风格数组。你可以在C++中用正确的运算符重载来制作自己的列主矩阵类。您可以重载
操作符()
,以获得与fortran完全相同的行为。在纯C中,您可以使用普通函数调用。我不知道编译器对列主访问的支持。这实际上会打破C/C++语法中指针去引用的基础。澄清我的观点——据我所知,语言本身没有内置的列或行主要概念或偏好。我认为这一点应该作为对这个问题的回答清楚。@Guest86关于你的最后一点,由于C语言中没有多维数组,只有数组的数组,所以读者对行和列的整个概念印象深刻。将第一个索引称为列-您刚刚得到了一个列主数组:-)@dasblinkenlight是的,但如果您在整个程序中始终将其视为arr[x][y]或arr[x],您将得到您所期望的结果-内存布局是相同的,但第一个参数是列还是行,都不是语言内置的。这个
arr[x][y]
将被翻译成
*((int*)arr+x*V+y)
其中
V
是高度,而不是
arr[y][x]
be
*((int*)arr+y*V+x)
其中
V
是宽度。@dasblinkenlight,是的,这正是我的意思:)@dasblinkenlight在读者的心目中“是一个很好的观点,我应该更抽象地提出这个问题——也许是关于最右边的索引跨过最左边索引的长度。