0

我有一个函数 setPosition 声明如下:

void setPosition(char ***grid, int a, int b) {
    int x = a / 8;
    int xbit = a % 8;
    int y = b;
    (*grid)[x][y] |= 1 << xbit;
}

在我的主要,我有:

char grid[1000][1000];
setPosition(&grid, 10, 5);

但我得到“警告:从不兼容的指针类型传递 'setPosition' 的参数 1”。为什么?

4

2 回答 2

4

数组和指针不是同一类型,即使数组在传递给函数时确实会衰减为指针。您可以更改方法签名以获取数组

void setPosition(char grid[][1000], Pos *p)

但如果你在做 C++,vector<vector<char> >会提供一个更好、更灵活的选择。

于 2012-04-13T00:35:47.437 回答
2

除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串文字,否则“N-element array of T”类型的表达式将被转换为/替换为/“衰减”为类型为“pointer to T”的表达式,其值是数组中第一个元素的地址。

如果您将函数称为

setPosition(grid, 10, 5);

该表达式grid将具有 type char [1000][1000],根据上面的规则,它将被替换为 type 的表达式char (*)[1000],因此您的函数原型需要是

void setPosition(char (*grid)[1000], int a, int b) { ... }

或者

void setPosition(char grid[][1000], int a, int b) { ... }

在这种情况下是一样的。

如果您将函数称为

setPosition(&grid, 10, 5);

那么表达式&grid有类型char (*)[1000][1000],所以你的函数原型需要是

void setPosition(char (*grid)[1000][1000], int a, int b) { ... }

并且您需要grid在应用任何下标之前显式取消引用,如

(*grid)[a][b] = ...;
于 2012-04-13T03:53:20.263 回答