繁体   English   中英

多维数组列宽

[英]Multidimensional Array column width

在函数中传递二维数组时,为什么要给出其列号如下:

int arr1[2][3] = {{1,2,3}, {4,5}};

void Array(const int [][3]); // prototype

为什么我们必须通过它列宽? 如果我将其保留为空,则会出现错误!

二维数组实际上是一维数组元素,而一维数组元素又是一维数组。

您可以考虑这样的数组声明

int arr1[2][3] = {{1,2,3},{4,5}};

以下方式

typedef int T[3];
T arr1[2] = {{1,2,3},{4,5}};

当按值传递数组作为函数的参数时,它将转换为指向其第一个元素的指针。

所以如果你有这样的功能

void Array(const T arr[] );

那么这个声明相当于

void Array(const T *arr );

并且两者都声明相同的一个功能。

重要的是要知道可以将指针算术与指针一起使用的完整类型T。 基于使用表达例如++arr那么就意味着,在当前的值arr增加sizeof( T ) 因此,编译器需要知道sizeof(T)。 否则它将无法执行指针算术运算。

因此,回到您的示例,编译器需要知道二维数组的元素类型,即其类型Tint[3]

所以这个清白

void Array(const int [][3]); 

相当于

void Array(const int ( * )[3]); 

或以下

typedef int T[3];
void Array(const T * );

在这种情况下,编译器将知道由其参数(即指针)指向的对象(传递的数组的第一个元素)的大小。

我注意到的一件事是,这种初始化看起来很可笑:

int arr1[2][3] = {{1,2,3}, {4,5}};

arr1有2行和列。 为什么第2行的第3列没有初始化? (仅供参考,编译器会将其设置为零,但是我不确定这是否是意图。)

在C语言中,多维数组表示为“扁平”一维数组。 此处说明: C数组如何在内存中表示?

在二维数组中,元素以行主顺序存储。 因此,这两个声明在概念上是相同的:

int arr2[ROWS][COLS];
int arr1[ROWS*COLS];

这两个访问在概念上是相同的:

arr2[i][j]
arr1[(i*COLS)+j]

实际上,在C语言中,第二种形式是实际情况。 这就解释了为什么您的原型需要知道多少列-这样编译器就可以执行乘法运算以获取线性数组中的适当元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM