我刚刚开始学习 C,有 Java 背景。我的代码中的几行遇到了问题。我试图复制我在其他线程中看到的内容,但坦率地说,它仍然给出错误。
无论如何,我只是想通过引用传递这些结构,但我收到了这四个错误。
printCard(&shuttleArray[i][j]); // Line 183
其中 printCard() 的 header 如下所示:
void printCard(struct Card* card)
然后
struct Card shuttleArray[14][4];
initMapping(&shuttleArray); // Line 199
initMapping(&mapping); // Line 343
initMapping() 的 header 在哪里
void initMapping(struct Card* array[14][4])
最后是第 229 行
printSpaceShuttleWithoutWings(&shuttleArray, shuttleCount); // Line 229
它的标题在哪里
void printSpaceShuttleWithoutWings(struct Card* shuttleArray[14][4], int shuttleCount)
感谢您的帮助。
最佳答案
void initMapping(struct Card* array[14][4])
声明一个函数,该函数采用指向struct Card
的指针的二维数组。
struct Card shuttleArray[14][4];
不是指向struct Card
的指针数组,因此不可能将其插入该参数槽中。这同样适用于 printSpaceShuttleWithoutWings
和 printSpaceShuttleWithoutWings
内部,其中 shuttleArray
被声明为指针数组,
printCard(&shuttleArray[i][j]);
尝试将 struct Card**
插入 struct Card*
参数。
我认为解决这个问题的最明智的方法是编写
void initMapping(struct Card array[14][4]);
// or, equivalently, one of
//
// void initMapping(struct Card array[][4]);
// void initMapping(struct Card (*array)[4]);
//
// The same needs to be done for printSpaceShuttleWithoutWings.
...
initMapping(shuttleArray);
这声明 array
应是一个指针1,指向每个由四个 struct Card
组成的一维数组,并且 shuttleArray
在函数调用中衰减为指向其第一个子数组的指针。 array[i]
是 shuttleArray
的第 i
子数组,表达式 array[i][j]
和 &array[i][j]
按您的预期工作。
1在函数参数声明中,数组语法是为了易读;声明的参数仍然是一个指针。外部数组范围(如果给定)将被默默忽略。
旁注:本来可以调用电话
initMapping(&shuttleArray)
通过将 initMapping
声明为
void initMapping(struct Card (*array)[14][4]);
...它将array
声明为指向struct Card
二维数组的指针。然而,这样做会使得在函数内部使用它变得更加麻烦;如果使用上面的代码,您可以编写 array[i][j]
,则必须使用此编写 (*array)[i][j]
。
关于c - C中的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28795197/