C 将多维数组传递给函数?

C 将多维数组传递给函数?,c,arrays,multidimensional-array,C,Arrays,Multidimensional Array,我有一个函数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; } 但我得到“警告:从不兼容的指针类型传递'setPosition'的参数1”。为什么?数组和指针不是同一类型,即使数组在传递给函数时会衰减为指针。您可以更改方法签名以

我有一个函数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;
}

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

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

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

<>但如果你正在做C++,矢量< /COD>会提供一个更好的和更灵活的选项。

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

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

<>但如果你正在做C++,代码>向量会提供一个更好的和更灵活的选项。

< P>,除非是<代码>的操作数或一元>代码>和/Cux>运算符,或者是一个字符串文字,用于初始化一个声明中的另一个数组,一个表达式“n-元素数组的代码< t>代码>将转换为/替换为/“decay”类型的表达式“pointer to
T
”,其值为数组中第一个元素的地址

如果将函数调用为

setPosition(grid, 10, 5);
setPosition(&grid, 10, 5);
表达式
grid
将具有类型
char[1000][1000]
,根据上述规则,该类型将被替换为类型
char(*)[1000]
的表达式,因此您的函数原型需要

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

在这种情况下也是一样的

如果将函数调用为

setPosition(grid, 10, 5);
setPosition(&grid, 10, 5);
然后表达式
&grid
的类型为
char(*)[1000][1000]
,因此您的函数原型需要

void setPosition(char (*grid)[1000], int a, int b) { ... }
void setPosition(char (*grid)[1000][1000], int a, int b) { ... }
在应用任何下标之前,您需要显式地取消引用
grid
,如中所示

(*grid)[a][b] = ...;

除非它是
sizeof
或一元
&
运算符的操作数,或者是用于初始化声明中另一个数组的字符串文字,否则类型为“T的N元素数组”的表达式将转换为/替换为/替换为类型为“指向
T
的指针”的表达式其值是数组中第一个元素的地址

如果将函数调用为

setPosition(grid, 10, 5);
setPosition(&grid, 10, 5);
表达式
grid
将具有类型
char[1000][1000]
,根据上述规则,该类型将被替换为类型
char(*)[1000]
的表达式,因此您的函数原型需要

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

在这种情况下也是一样的

如果将函数调用为

setPosition(grid, 10, 5);
setPosition(&grid, 10, 5);
然后表达式
&grid
的类型为
char(*)[1000][1000]
,因此您的函数原型需要

void setPosition(char (*grid)[1000], int a, int b) { ... }
void setPosition(char (*grid)[1000][1000], int a, int b) { ... }
在应用任何下标之前,您需要显式地取消引用
grid
,如中所示

(*grid)[a][b] = ...;

C还是C++,这是什么?“正确”的答案会有所不同。他们不是同一种语言,啊DC,我的坏,我在事故中加上了C++,忘记了删除它。C还是C++,是什么?“正确”的答案会有所不同。他们不是同一种语言,啊DC,我的坏,我在事故中加上C++,忘记删除它。