1.結構體類型的聲明
1.1結構體的概念
結構是?些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量。
1.2 結構的聲明
struct tag
{member-list;
}variable-list;
例如描述?個學?:
struct Stu
{char name[20];//名字int age;//年齡char sex[5];//性別char id[20];//學號}; //分號不能丟
1.3 特殊的聲明
在聲明結構的時候,可以不完全的聲明。
比如:
//匿名結構體類型
struct
{int a;char b;float c;
}x;
struct
{int a;char b;float c;
}a[20], *p;
上?的兩個結構在聲明的時候省略掉了結構體標簽(tag)。
//在上?代碼的基礎上,下?的代碼合法嗎?
p = &x;
警告:
編譯器會把上?的兩個聲明當成完全不同的兩個類型,所以是?法的。
匿名的結構體類型,如果沒有對結構體類型重命名的話,基本上只能使??次。
1.4結構的自引用
?如,定義?個鏈表的節點:
struct Node
{
int data;struct Node next;
};
仔細分析,其實是不?的,因為?個結構體中再包含?個同類型的結構體變量,這樣結構體變量的? ?就會?窮的?,是不合理的。
正確的?引??式:
struct Node
{int data;struct Node* next;
};
在結構體?引?使?的過程中,夾雜了typedef對匿名結構體類型重命名,也容易引?問題,看看下? 的代碼,是否可行?
typedef struct
{int data;Node* next;
}Node;
答案是不?的,因為Node是對前?的匿名結構體類型的重命名產?的,但是在匿名結構體內部提前使 ?Node類型來創建成員變量,這是不?的。
解決?案如下:定義結構體不要使?匿名結構體了。
typedef struct Node
{int data;struct Node* next;
}Node;