我有一个函数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”。为什么呢?
答案 0 :(得分:4)
数组和指针的类型不同,即使数组在传递给函数时衰减到指针。您可以更改方法签名以获取数组
void setPosition(char grid[][1000], Pos *p)
但如果您正在使用C ++,vector<vector<char> >
将提供更好,更灵活的选项。
答案 1 :(得分:2)
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of T
“将转换为/替换为/”decay“到”指向T
的指针“类型的表达式,其值是数组中第一个元素的地址。
如果您将您的功能称为
setPosition(grid, 10, 5);
表达式grid
将具有类型char [1000][1000]
,根据上面的规则,它将替换为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] = ...;