【问题标题】:What is the use of declaring a pointer to a structure with typedef? [closed]用 typedef 声明指向结构的指针有什么用? [关闭]
【发布时间】:2020-07-29 05:35:08
【问题描述】:

如图所示,我声明了一个指向结构的指针,一个带有 typedef 关键字,另一个没有 typedef 关键字,我正在尝试分配同一个用户定义数组的地址,但我得到了一个第 19 行出错。

当我注释掉第 19 行并构建项目时,第 20 行没有出现错误。

【问题讨论】:

  • 顺便说一句。没有人可以看到图像。我建议将代码作为文本复制并粘贴到问题中,然后将整个内容缩进 4 个空格(选择代码,使用 {} 按钮或 CTRL+K 键缩进整个块)。这总是有效的。
  • 好的,我们现在可以看到图片了,但是您和其他所有人都使用文本比使用图片要好得多。
  • 你混合了你的隐喻。 NODE 是一个 typedef(即一个类型)。 NODE2 是指向struct node 的全局范围指针。您可以为NODE2 赋值,因为它是一个变量。惯例是对变量使用全部大写,因为全部大写用于常量,例如#define PI 3.14159。最好使用struct node *my_node_pointer;NODE my_node_pointer; 但是,您不能type 赋值。因此,NODE = arr; 无效。
  • 我投票决定关闭它,因为所有代码都在图像中。此外,您还缺少 错误消息,这不是整个代码摘录。

标签: c data-structures struct


【解决方案1】:
typedef struct node *NODE;

类型 struct node * 引入同义词 NODE。您不能为类型分配值,因此行

NODE = arr;

编译失败。

struct node *NODE2;

引入一个名为 NODE2 的全局变量,类型为 struct node *。您可以根据需要分配给此变量,因此行

NODE2 = arr;

不报错。


上面类似如下:

typedef int Int32;
int Counter;

...

Int32 = 5; // error
Counter = 5; // valid

【讨论】:

  • @SagarTube: NODEstruct node* 的别名
  • 所以,根据答案NODE 只是struct node 的别名,而NODE2struct node* 的全局变量,但现在考虑使用malloc 的代码来创建一个内存块和 malloc 返回一个 void 指针,因此为了使用内存块,我们必须将类型转换为特定类型的指针并使用 NODE 关键字我们可以做到这一点,而不是 struct node* 例如:NODE x = (NODE) malloc (sizeof(struct node)); 这怎么可能?
  • @SagarTube:有什么问题? NODE x = (NODE)malloc(sizeof(struct node));struct node *x = (struct node*)malloc(sizeof(struct node)); 相同。另外请注意,您不需要在 C 中编写显式转换,只需在 C++ 中即可。
【解决方案2】:

您不能为数据类型赋值。

typedef 本质上是从 struct 为您的用户定义数据类型创建一个别名。

当你使用

typedef struct node *NODE;

它创建了一个名称NODE,其数据类型(此处为struct node *)由typedef给出。

另一方面,如果你不 typedef 它,直接写成

struct node *NODE;

它会创建一个结构节点类型的指针变量。 (而不是数据类型)

【讨论】:

  • typedef 为已存在的数据类型创建别名。 struct 创建用户定义的数据类型
  • @M.M 谢谢,已更正!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多