需要帮助来理解C中的结构

时间:2016-11-29 16:49:44

标签: c struct

我需要一些帮助来理解这个结构:

typedef struct std_fifo{
    char* name;
    struct std_fifo* next;
}std_fifo, *fifo;

使用typedef我知道我只能使用std_fifo而不是在我的代码中编写struct std_fifo。但是*fifo

呢?

2 个答案:

答案 0 :(得分:3)

代码

typedef struct std_fifo{
    char* name;
    struct std_fifo* next;
}std_fifo, *fifo;

创建两个(命名非常严重)typedef名称std_fifofifo

typedef名称std_fifo等同于struct std_fifo类型,可用于代替struct std_fifo

std_fifo fifo_instance;      // creates an instance of struct std_fifo
std_fifo get_fifo();         // declares get_fifo as a function returning an 
                             // instance of struct std_fifo
void read_fifo( std_fifo * );// declares a function taking parameter of type
                             // pointer to struct std_fifo

typedef名称fifo等同于struct std_fifo *类型,可用于代替struct std_fifo *

fifo fifo_ptr;               // creates a pointer to an instance of struct std_fifo
fifo get_fifoptr();          // declares get_fifoptr as a function returning a pointer
                             // to an instance of struct std_fifo
void read_fifo( fifo );      // declares a function taking a parameter of type
                             // struct std_fifo *

原因代码如

typdef struct std_fifo { ... } std_fifo;

的作用是因为C为标识符提供了四个不同的名称空间:标签,标签名称,structunion成员名称以及其他所有内容。 标记名称 std_fifo始终以struct关键字开头,这是编译器将其与std_fifo typedef名称区分开来的方式。

关于使用typedef的一些建议:

虽然在某些情况下它们可以帮助您更好地扫描代码,但使用typedef实际上可能会模糊您的意图并使类型更难使用。如果该类型的用户必须知道其表示(例如访问struct的成员,或取消引用指针类型,或在printf或{中使用正确的转换说明符{1}}调用,或者在属性上调用函数等),然后你应该隐藏typedef背后的表示。

如果您决定想隐藏typedef背后的类型表示,那么您还应该为涉及该类型的任何操作提供完整的API。 C使用scanf类型执行此操作;而不是直接操作FILE对象,而是将指针传递给各种FILE例程。因此,如果您决定隐藏typedef名称stdio后面的struct std_fifo *,那么您还应该创建一个API:

fifo

抽象可能是一件好事,但“漏洞”抽象比没有抽象更糟糕。

答案 1 :(得分:1)

结构的有效定义是赋予名称和指针。

typedef struct std_fifo{
    char* name;
    struct std_fifo* next;
}std_fifo, *fifo;

在此代码中,std_fifo是结构,*fifo是指向此结构的指针。

我强烈建议您在这里查看:http://www.cplusplus.com/forum/windows/57382/