当我声明或只写一个在C语言中使用二维void board(char mat[][MAX_COLUMNS]);
数组的函数时,Visual Studio告诉我必须在columns参数中放置一个值,例如:
<TableBody>
{fetchData.map(([title, row], index) => {
return (
<Fragment>
<TableRow key={index}>
<TableCell colSpan="2">{title}</TableCell>
</TableRow>
{row.map(({ displaytext, value }, i) => (
<TableRow key={index + i}>
<TableCell>{displaytext}</TableCell>
<TableCell>{value}</TableCell>
</TableRow>
))}
</Fragment>
);
})}
</TableBody>
所以我的问题是为什么我什至需要告诉C二维数组的一维,以及为什么它必须专门是列数。
答案 0 :(得分:2)
因为数组不是C中的第一类对象。当您将数组传递给函数时,它衰减到指针,被调用者无法猜测大小。对于一维数组,它仍然允许通过指针算术访问元素。但是对于2D数组(数组的数组),指针算法要求知道第二级对象(此处为行)的大小。这就是为什么列数必须明确的原因。
此外,Microsoft C不支持可变长度数组,因此列数必须为常数。
答案 1 :(得分:1)
风向标指出得很好。
此外,如果您想规避该限制,请使用以下原型:
void board(char *mat, int rows, int columns);
您可以通过此表达式访问它。
mat[i*columns+j]
当您要访问第i
行第j
列元素时。
希望它有所帮助!
答案 2 :(得分:0)
void board(char mat[][MAX_COLUMNS]);
等效于
void board(char (*mat)[MAX_COLUMNS]);
char (*mat)[MAX_COLUMNS]
是2D数组传递给board()
时的类型:指向第一个元素的指针,就像传递给函数的任何数组一样。
答案 3 :(得分:0)
假设您有一个数组
char arr[3][4];
并将函数定义为
void board(char mat[][4])
该数组衰减为一个指针,因此如果函数要访问mat[2][1]
,则指针的偏移量将为行x宽度+列元素,因此2 * 4 + 1 = 9
。请注意,无论有多少维,数组始终是连续的。
但是如果您将函数定义为
void board(char mat[][])
然后,除了指针之外没有任何信息,并且编译器也不知道如何为数组建立索引。
给定维数必须是列数的原因是因为这是数组在内存中逐行布置的方式。