4

请帮助我识别此部分typdef以及每个部分的作用以及如何使用它:

typedef struct my_struct
{
        int a;
        int b;
        int c;
} struct_int, *p_s;

struct_int struct_array[5];

我认为他们是什么,如果错了请纠正:

  1. typedef struct正在创建一种新类型。
  2. my_struct是此类型的名称,但未在其余代码中使用。
  3. struct_int是我们可以在代码中使用的类型的一个实例。
  4. *p_s是专门指向我们创建的一个实例的指针。
  5. struct_array是我们创建的实例的数组。(这部分让我很困惑,因为我们已经创建了一个实例......)

此外,在创建结构数组时,为什么我们使用struct_int而不是my_struct

4

6 回答 6

4

struct my_struct是类型的名称,my_struct是标签名称而不是类型。

typedef不在 C 中创建类型,而是为现有类型创建别名。

于 2012-04-05T23:34:35.283 回答
3

不完全的!以下是不同部分的含义:

struct my_struct:在这里,您正在创建一个新的数据类型,struct my_struct每当您想要创建对象的新实例时,您都会引用它。例如你应该说:struct my_struct a;不是 my_struct a;

typedef struct my_struct {} struct_int;: 在这里您只需为其创建一个别名struct my_struct并为其命名struct_int。从现在开始,你可以说,struct_int a;而不是struct my_struct a;

typedef struct my_struct {} *p_s;在这里,您为指向 的数据类型创建一个新别名struct my_struct。你可以像这样使用它:p_s newStruct = malloc(sizeof(struct_int));

于 2012-04-05T23:38:17.990 回答
3

typedef struct正在创建一种新类型。

typedef是定义struct_int和,它们分别是和的p_s同义词。这个想法是为了让您不必长时间输入内容并提高可读性(并非总是如此)。struct my_structstruct my_struct*

my_struct是此类型的名称,但未在其余代码中使用。

因为您必须使用my_structas struct my_struct,但您必须typedef引用struct_int该类型并且它更简单。

struct_int是我们可以在代码中使用的类型的一个实例。

不,请阅读以上内容。如果您删除了typedef,那么您创建两个变量struct_intp_s.

*p_s是专门指向我们创建的一个实例的指针。

不,请阅读以上内容。

struct_array是我们创建的实例的数组。(这部分让我很困惑,因为我们已经创建了一个实例......)

struct_array是一个类型数组struct_int,因此它是一个类型数组struct my_struct。在struct.

此外,在创建结构数组时,为什么我们使用struct_int而不是my_struct

与上述问题之一相同;你可以使用struct my_structor struct_int,struct_int更短,它会破坏typedefing的目的struct_int

于 2012-04-05T23:40:15.197 回答
2

my_struct是此类结构的名称。以后可以使用它来声明更多这种类型的结构。

struct_int是 typedef 创建的别名的名称。

*p_s是指向my_struct(aka struct_int) 类型结构的指针。它可以指向这种类型的结构。

struct_array是 s 数组的名称my_struct。但是,由于它是用 alias 声明的struct_int,我们稍后应该将其称为 one。

使用别名是个人偏好,实际上可以删除其中一个my_struct或另一个。struct_int

于 2012-04-05T23:38:57.570 回答
1

您的假设部分正确。我想进入 3. 和 4.

如果你删除了typedef并且有这个:

struct my_struct {
  // ...
} struct_int_v, *p_s_v;

然后,您将声明两个变量 struct_int_vp_s_v使用您期望的类型(一个是struct my_struct,另一个是struct my_struct*)。

但是,在引入stroage 说明符 typedef时,您是在告诉 C 不要创建变量而是创建类型,而声明语法是相同的。

因此,struct_int将是变量将具有的类型,并且将是变量struct_int_v具有p_s的类型struct_int_v

请注意,存储说明符typedef(或static就此而言)适用于所有变量(而其他限定符如 egconstvolatile适用于相反的类型)最多;.

于 2012-04-05T23:44:22.700 回答
1

您主要回答了您自己的问题,所以我将解决我看到的剩下的两点:

首先,struct定义创建的类型的名称是struct my_struct。您可以声明变量,例如

struct my_struct a;
struct my_struct b;

但你不想一直写struct,所以你使用typedef. 单独定义结构和别名可能会更清楚一些:

struct my_struct {
  int a, b, c;
};
typedef struct my_struct struct_int;
typedef struct my_struct *p_s;

这首先定义了一个名为的类型,然后定义为该类型的别名struct my_struct,然后定义为该类型的别名。您编写的代码将所有这三件事合二为一,但它的含义相同。struct_intstruct my_structp_sstruct my_struct *

其次,类型别名p_s与数组无关struct_array*p_s没有定义结构的实例,因为它是 a 的一部分:typedef它定义了一个类型别名。但即使没有typedefp_s因此是一个实际的指针变量,之后定义的数组也是一个单独且不相关的变量。

于 2012-04-05T23:44:54.997 回答