結構標籤(struct tag)與類型定義(typedef)的區別

  問題1:兩種聲明有什麼不同?

struct x1 {...};
typedef struct {...} x2;
答:第一種形式聲明瞭一個結構標籤,第二種聲明瞭一個“類型定義”。主要區別在於第二種聲明更抽象一些,用戶不必知道它是一個結構,且在聲明它的實例時也不需要使用struct關鍵字。例如:
x2 b;//是OK的
但是使用結構標籤聲明的結構就必須用這樣的形式定義:
struct x1 a;
也可以同時使用
typedef struct x3 {...} x3;
儘管有些晦澀,但爲標籤和類型定義使用同樣的名稱是合法的,因爲它們處於獨立的命名空間中。

問題2:結構體可以包含自己的指針嗎?
當然可以,但是如果要使用typedef,則有可能產生問題。
例如:
typedef struct{
    char *item;
    NODEPTR next;//錯誤,不能在定義typedef類型之前使用它
}*NODEPTR;
版本1:
typedef struct node {
    char *item;
    struct node *next;
}*NODEPTR;
版本2:
struct node {
    char *item;
    struct node *next;
};
typedef struct node *NODEPTR;

結構體可以包含指向自己的指針嗎?結構標籤(struct tag)與類型定義(typedef) - myswirl - MY BLOG

運行環境:VC6.0
例子程序:tets.c
*************************************************************************************************
#include <stdio.h>

struct x1 //x1爲結構標籤
{
    int a;
    int b;
};
typedef struct  
{
    int c;
    int d;
}tx;    //tx爲類型定義

typedef struct node
{
    char item;
    struct node *next;    //結構體中定義指向自己的指針
}NODEPTR;

/*
typedef struct node
{
    char *item;
    NODEPTR next;    //不可以,不能在typedef類型之前使用它
}*NODEPTR;
*/
void main(void)
{
    struct x1 s1;    //不能用結構標籤自動生成類型定義名: x1 s1
    tx s2;
    NODEPTR node1;
    NODEPTR node2;
    node1.next = &node2;

    s1.a = 1;
    s1.b = 2;
    s2.c = 3;
    s2.d = 4;
    node1.item = 'x';
    node2.item = 'y';
    printf("s1.a:%d, s1.b:%d \n",s1.a,s1.b);
    printf("s2.c:%d, s2.d:%d \n",s2.c,s2.d);
    printf("%c, %c \n",node1.item, node2.item);

}
*************************************************************************************************
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章