一.基礎知識
1.聚合數據類型(aggregate data type)能夠同時存儲超過一個的單獨數據。C提供了兩種類型的聚合數據類型,數組和結構。
(1)數組是相同類型的元素的集合,它的每個元素是通過下標引用或指針間接訪問來選擇的。
(2)結構也是一些值的集合,這些值稱為它的成員(member),但一個結構的各個成員可能具有不同的類型。
2.數組元素可以通過下標訪問,這只是因為數組的元素長度相同。
3.由於一個結構的成員可能長度不同,所以不能使用小標來訪問它們。相反,每個結構成員都有自己的名字,它們是通過名字訪問的。
4.結構並不是一個它自身成員的數組。和數組名不同,當一個結構變量在表達式中使用時,它並不被置換成一個指針。結構變量也無法使用下標來選擇特定的成員。
5.結構變量屬於標量類型,結構也可以作為傳遞給函數的參數,它們也可以作為返回值從函數返回,相同類型的結構變量相互之間可以賦值。
6.可以聲明指向結構的指針,取一個結構變量的地址,也可以聲明結構數組。
二.結構聲明
1.在聲明結構時,必須列出它包含的所有成員。該列表包括每個成員的類型和名字。
eg:
struct tag{
member-list;
}variable-list;
結構體聲明由三部分組成,tag,member-list,variable-list。所有可選部分不能全部省略---它們至少出現兩個。
1>例子:
struct {
int a;
char b;
float c;
}x;
這個聲明創建了一個名叫x的變量,它包含三個成員:一個整數、一個字符和一個浮點數。
struct {
int a;
char b;
float c;
}y[20],*z;
這個聲明創建了y和z。y是一個數組,它包含了20個結構。Z是一個指針,它指向這個類型的結構。
2>說明:
以上兩個聲明被編譯器當作兩種截然不同的類型,即使它們的成員列表完全相同。因此,變量y和z的類型和x的類型不同,所以下面這條語句。
z = &x;是非法的
3>但是,這是不是意味著某種特定類型的所有結構都必須使用一個單獨的聲明來創建呢。其實不然,標簽(tag)字段允許為成員列表提供一個名字。
eg:
struct SIMPLE {
int a;
char b;
float c;
};
這個聲明把標簽SIMPLE和這個成員列表聯系在一起。該聲明並沒有提供變量列表,所以它並未創建任何變量。
² 標簽標識了一種模式,用於聲明未來的變量,但無論是標簽還是模式本身都不是變量。
eg struct SIMPLE x;
struct SIMPLE y[20],*z;
這些聲明使用標簽來創建變量。它們創建和前面的例子是一樣的,不同的是:現在x,y和z都是同一種類型的結構變量。
2.聲明結構時可以使用的另一種良好技巧是用typedef創建一種新的類型。
typedef struct {
int a;
char b;
float c;
} Simple;
這個技巧和聲明一個結構標簽的效果幾乎相同。區別在於:Simple現在是個類型名而不是個結構標簽,所以後續的聲明可能像下面:
Simple x;
Simple y[20],*z;
注:如果想在多個源文件中使用同一種類型的結構,你應該把標簽聲明或typedef形式的聲明放在一個頭文件中。當源文件需要使用這個聲明時可以使用#include指令把該頭文件包含進來。
3.結構成員
1>結構成員可以是任何變量。結構成員可以是標量,數組,指針或者是其他結構。
2>一個結構的成員的名字可以和其他結構的成員的名字相同。並不會產生沖突。