我有一个二维数组,代表图中的几个点。传递指向多维数组的指针
int16_t myPoints[][3] = {
{0, 0},
{20, 40},
{14, 92}};
如何将指针传递给能够读取这些坐标的函数?
有点像?
void foo(int16_t *coordinates[][]) {
drawPoint(x[0], y[0]);
drawPoint(x[1], y[1]);
...
感谢您的帮助。
我有一个二维数组,代表图中的几个点。传递指向多维数组的指针
int16_t myPoints[][3] = {
{0, 0},
{20, 40},
{14, 92}};
如何将指针传递给能够读取这些坐标的函数?
有点像?
void foo(int16_t *coordinates[][]) {
drawPoint(x[0], y[0]);
drawPoint(x[1], y[1]);
...
感谢您的帮助。
只有第一个维度可以是未知的,所以你必须声明/定义这样的功能:
void foo(int16_t coordinates[][3])
{
drawPoint(coordinates[0][0], coordinates[1][0]);
drawPoint(coordinates[0][1], coordinates[1][1]);
drawPoint(coordinates[0][2], coordinates[1][2]);
}
然后,你可以把它像一个正常的功能:
foo(myPoints);
编辑:您的数组声明不正确,我也错过了它。它应该是:
int16_t myPoints[][2] = {
/* List of points */
};
现在你有一个合适的坐标数组,它可以是你喜欢的长度。
有关功能了解的条目数,你必须把它传递给函数,因此新功能的声明将是:
void foo(int16_t coordinates[][2], int number_of_points);
不要担心复制,编译器是足够聪明只传递指向数组的指针,所以它不会复制整个数组。
通过重复适当的声明函数的参数:
void foo(int16_t coordinates[][3])
{
...
}
您必须包括除一出,立即在变量名以下,这是可选的所有阵列的尺寸。声明一个函数时
不,这是从我的例子的另一种方式。你需要'int16_t coord [] [2])',并删除星号。 – unwind
规则是当大多数情况下出现“T
”类型的“N元素数组”表达式时,它将被转换为“指向T
的指针”类型的表达式。
myPoints
是“int16_t
的3元素阵列的3元素阵列”类型的表达式。因此,当myPoints
出现在大多数上下文中(例如函数调用)时,它将被替换为“指向3元素数组的指针int16_t
”或int16_t (*)[3]
的表达式。
如果你想打电话foo
为foo(myPoints)
,那么原型将需要
void foo(int16_t (*coordinates)[3])
或
void foo(int16_t coordinates[][3])
在函数参数声明的情况下,T a[N]
,T a[]
和T *a
都是等效的,并且全部都声明a
作为指向T
的指针。请注意,这是只有在函数参数声明中为true。
1 - 该规则的例外是当阵列表达是sizeof
或一元&
运营商的操作数,或是被字面用于初始化在声明另一阵列的字符串。
但它是否将整个数组复制到foo或只是将指针传递给它?我也只知道 ,每个条目总会有两个坐标,但我不知道有多少条目会有 来。
如果传递的可变长度数组,要么必须传递元件作为一个单独的参数或者所述阵列的最后一个元素的数量必须以某种方式表明它是最后一个元素,这样就可以终止该函数使用while()循环(如添加NULL来终止字符串)。
enum STATUS { OK, END };
STATUS bar(int16_t x, int16_t y); /* bar() checks to see if this is the last element */
void foo(int16_t coordinates[][2])
{
int i = 0;
while(END != bar(coordinates[i][0], coordinates[i][1]))
{
drawPoint(coordinates[i][0], coordinates[i][1]);
++i;
}
}
但它是否将整个数组复制到foo,还是只是将指针传递给它?我也只知道每个条目总是有两个坐标,但我不知道会有多少条目。 –
@Tectu更新了我的回答 –
非常感谢你:) –