将指针传递给多维数组

时间:2012-05-31 11:39:06

标签: c arrays pointers

我有一个二维的整数数组,代表图中的几个点。

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]);
   ...

感谢您的帮助。

4 个答案:

答案 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;
    }
}