结构指针前向声明



我是c编程和创建链表数据结构的新手,我的老师给了我一些似乎有点混乱的代码:

typedef struct node *ptr;
ptr start,current;
typedef struct node{
    int value;
    ptr next;
};

这段代码工作得很好,使用其他函数,我可以创建一个链表,我的困惑是,当我改变这样的代码:

node *start;
node *current;
typedef struct node{
    int value;
    node *next;
};

不工作。这段代码有什么问题,为什么我不能再向前声明节点指针

typedef struct node *ptr;
ptr start,current;
typedef struct node{
    int value;
    ptr next;
};

结构本身的类型定义不会以这种方式工作,我猜你在末尾缺少node(它缺少新定义类型的标识符)。

在这一点上,我会告诉你的老师请不要通过typedef一个指针类型来混淆大家。指针类型修饰符在每次使用中都是可见的,这是很常见的,只是为了使明显是指针。现在来看实际答案:
node *start;
node *current;
typedef struct node{
    int value;
    node *next;
};

从第一行开始:在这里使用node作为类型标识符。但是你还没有告诉编译器node应该是什么样的类型。实际上,您实际上缺少的是一个前向声明。它的工作方式如下:

/* forward-declare "struct node" and at the same time define the type
 * "node" to be a "struct node":
 */
typedef struct node node;
/* now use your type by declaring variables of that type: */
node *start;
node *current;
/* finally fully declare your "struct node": */
struct node {
    int value;
    node *next;
};

或者,没有typedef,这很容易让初学者困惑:

struct node; /* forward declaration (not strictly necessary in this little example) */
struct node *start;
struct node *current;
struct node {
    int value;
    struct node *next;
};

在第二种情况下所做的不是前向声明。它试图在没有定义类型(node)的情况下使用它。

第一种情况也不太适用。它给出以下警告:

警告:在空声明

中无用的存储类说明符

这是因为您没有为struct node分配类型别名。你必须这样做:

typedef struct node{
    int value;
    ptr next;
} node;
现在,您可以使用node来代替struct node

相关内容

  • 没有找到相关文章

最新更新