结构指针前进声明?

时间:2015-10-14 17:34:32

标签: c pointers struct linked-list structure

我是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;
};

它不起作用。这段代码出了什么问题,为什么我不能再向前声明节点指针了。

2 个答案:

答案 0 :(得分:4)

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

struct本身的typedef不会以这种方式工作,我猜你最后错过了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;
};

答案 1 :(得分:1)

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

第一种情况也不太奏效。它给出了以下警告:

  

警告:空声明中无用的存储类说明符

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

typedef struct node{
    int value;
    ptr next;
} node;

现在,您可以使用node代替struct node