C語言的基本類型有:整型(int)、字符型(char)、浮點型(float)、雙精度型(double)、空值型(void)以及派生類型 (指針和數組)。本章介紹C語言中可由用戶構造的三種數據類型:
(1)用戶定義類型(typedef);(2)結構體(struct);(3)共用體(union);
C語言允許用 typedef 說明一種新類型名,一般形式為:
typedef 類型名 標識符;
“類型名”必須是在此語句前已有定義的類型標識符。“標識符”是一個用戶定義標識符。typedef 語句的作用僅僅是用“標識符”來代表已存在的“類型名”,並不產生新的數據類型,原有類型名依然有效。例如:
typedef int INTEGER;
該語句把一個用戶命名的標識符 INTEGER 說明稱一個 int 類型的類型名。在此說明之後,可以用標識符 INTEGER 來定義整型變量。例如:
INTEGER m, n; 等價於 int m, n;
INTEGER 是 int 的一個別名。為便於識別,一般習慣將新的類型名用大寫字母表示。如:
typedef char* CHARP;
CHARP p;
等價於:char* p;
結構體類型說明的一般形式為:
struct 結構體標識名
{
類型名1 結構成員名表1
類型名2 結構成員名表2
...
類型名n 結構成員名表n
};
其中 struct 是關鍵字。“結構體標識名”和“結構成員名”是用戶定義的標識符,其中“結構體標識名”是可選項,在說明中可以不出現。每個“結構成員名表”中都可以含有多個同類型的成員名,它們之間用逗號隔開。結構體中的成員名可以和程序中的其他變量同名;不同結構體中的成員也可以同名。注意:結構體說明同樣要以分號(;)結尾。
struct date
{int year, month, day;};
結構體類型說明中的“類型名”,不僅可以是簡單數據類型,也可以是結構體類型。當結構體說明中又包含結構體時,成為結構體的嵌套。如下:
struct student
{
char name[12];
char sex;
struct date birthday;
float sc[4];
};
ANSI C 標准規定結構體至少允許嵌套15層,允許內嵌結構體成員的名字與外層成員的名字相同。
結構體類型的說明只是列出了該結構的組成情況,標志著這種類型的結構“模式”已經存在,編譯程序並沒有因此而分配任何存儲空間。真正占有存儲空間的仍是具有相應結構體類型的變量、數組以及動態開辟的存儲單元。因此,在使用結構體變量、數組或指針變量前,必須先對這些變量、數組或指針變量進行定義。