除非它是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] = ...;