|
|
1
6
只需声明数组参数。更好的是,对初始声明和函数的形参都使用typedef。 问题是,在不知道行大小(即列数)的情况下,它无法计算指针调整以获得后续行。有趣的是,它不需要知道您有多少行。 例如,这是可行的:
但最好将调用方的类型和函数的类型联系在一起。 每个子脚本访问都需要一个乘法,但这是有效的(只有符合C99的编译器)。
另一个示例,即使在C89之前的环境中也可以使用:
最后,由于变长数组是最近才出现的,传统的也是最快的技术是通过
|
|
|
2
1
如果数组是“实”二维数组,则需要指定除第一个维度以外的所有维度的大小:
这有一些潜在的问题。如果你的二维数组真的是指针数组(
或者,为了使函数更通用,可以将其更改为接受两个int指针(可以指向任何地方)并交换它们:
你可以这样称呼它:
|
|
|
3
1
在C语言中,只允许未指定数组的第一维,因为它需要知道如何计算偏移量。如果需要在数组中使用可变大小的二维数组pass作为int*,请自己传递第二个维度的大小和指针数学:
这与[[]语法所做的相同,因为C中的数组实际上只是指针。 |
|
|
4
1
gcc允许可变长度数组作为函数的参数:
|
|
5
1
将多维数组作为函数参数传递会带来一些麻烦。记住,在大多数上下文中,数组类型的表达式将隐式转换为指针类型,其值将是数组第一个元素的地址。例如,一个10x20的int数组将被转换为指向一个20元素的int数组的指针:
这就是出现大问题的地方。基于它的原型,swap()只能处理nx20 int数组;行的数量可以变化,但列的数量不能,因为
在这里,我们传递第一个元素的地址(&surface[0][0]),并将其视为指向int的简单指针。这样,我们可以处理任意数量的行和列。注意,这只适用于实际的二维数组(而不是指针数组),因为swap假定数组元素是连续排列的。 |