我想我们都同意通过以一维方式取消引用指向其第一个元素的(可能是偏移的)指针来访问真正的多维数组被认为是惯用的 C,例如:
void clearBottomRightElement(int *array, int M, int N)
{
array[M*N-1] = 0; // Pretend the array is one-dimensional
}
int mtx[5][3];
...
clearBottomRightElement(&mtx[0][0], 5, 3);
但是,我的语言律师需要说服这实际上是定义明确的 C!尤其:
标准是否保证编译器不会在 eg
mtx[0][2]
和之间添加填充mtx[1][0]
?通常,从数组的末尾索引(除了末尾的一个)是未定义的(C99,6.5.6/8)。所以以下显然是未定义的:
struct { int row[3]; // The object in question is an int[3] int other[10]; } foo; int *p = &foo.row[7]; // ERROR: A crude attempt to get &foo.other[4];
因此,按照同样的规则,人们会期望以下内容是未定义的:
int mtx[5][3]; int (*row)[3] = &mtx[0]; // The object in question is still an int[3] int *p = &(*row)[7]; // Why is this any better?
那么为什么要定义这个呢?
int mtx[5][3]; int *p = &(&mtx[0][0])[7];
那么 C 标准的哪一部分明确允许这样做呢?(为了讨论,我们假设c99 。)
编辑
请注意,我毫不怀疑这在所有编译器中都可以正常工作。我要查询的是标准是否明确允许这样做。