c - C中的指针问题

标签 c pointers struct pass-by-reference

我刚刚开始学习 C,有 Java 背景。我的代码中的几行遇到了问题。我试图复制我在其他线程中看到的内容,但坦率地说,它仍然给出错误。

无论如何,我只是想通过引用传递这些结构,但我收到了这四个错误。

Errors

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的指针数组,因此不可能将其插入该参数槽中。这同样适用于 printSpaceShuttleWithoutWingsprintSpaceShuttleWithoutWings 内部,其中 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/

相关文章:

c - C 中每个数据包都有 TTL 的数据包队列的最佳收集类型是什么

c - 指针和结构类型的大小看似不一致的原因是什么?

c - 两个相互包含的结构体

c - 在c中使用*代替->运算符

c - 使用 QNX 编译器使用 C 读取 arm64 中的寄存器

c++ - C++ 中使用指针和指向指针的指针读取和存储序列化对象的快速方法

C++指针数组似乎不符合逻辑

c++ - C/C++ 中的循环依赖结构

c# - 从 C# 调用包含指针的 Delphi DLL 结构不起作用

c - C 中的 freopen() 导致无限循环!