我有一个二维的整数数组,代表图中的几个点。
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]);
...
感谢您的帮助。
答案 0 :(得分: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);
不要担心复制,编译器足够聪明,只能将指针传递给数组,因此不会复制整个数组。
答案 1 :(得分:1)
规则是当大多数上下文中出现“N元素数组T
”的表达式时,它将被转换为“指向T
的指针”类型的表达式。
myPoints
是“int16_t
的3元素数组的3元素数组”类型的表达式。因此,当myPoints
出现在大多数上下文 1 (例如函数调用)时,它将被替换为类型为“指向int16_t
的3元素数组的指针”的表达式“,或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
声明为指向{{1}的指针}。请注意,在函数参数声明中,这只是 。
1 - 规则的例外情况是数组表达式是T
或一元sizeof
运算符的操作数,或者是用于初始化另一个数组的字符串文字。声明。
答案 2 :(得分:0)
重复函数参数的正确声明:
void foo(int16_t coordinates[][3])
{
...
}
您必须包含紧跟变量名后面的所有数组维度,这是可选的。
答案 3 :(得分:0)
但是这会将整个数组复制到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;
}
}