整數、字符、布爾值、浮點數這些數據類型都具備單一的值,這些可稱爲基本數據類型。但字符串是一個例外,它由不少字符組成,像這種由基本類型組成的數據類型稱爲複合數據類型,正如表達式和語句有組合規則同樣,由基本類型組成複合類型也有一些組合規則。數組
在實際問題中,一組數據每每具備不一樣的數據類型。例如,在學生登記表中,姓名應爲字符型;學號可爲整型或字符型;年齡應爲整型;性別應爲字符型;成績可爲整型或實型。顯然不能用一個數組來存放這一組數據。由於數組中各元素的類型和長度都必須一致,以便於編譯系統處理。爲了解決這個問題,C語言中給出了另外一種構造數據類型——「結構」或叫「結構體」。它至關於其它高級語言中的記錄。數據結構
「結構」是一種構造類型,它是由若干「成員」組成的。每個成員能夠是一個基本數據類型或者又是一個構造類型。結構既是一種「構造」而成的數據類型,那麼在說明和使用以前必須先定義它,也就是構造它。如同在說明和調用函數以前要先定義函數同樣。ide
定義一個結構的通常形式爲:函數
struct 結構名{ 成員表列 };
成員表列由若干個成員組成,每一個成員都是該結構的一個組成部分。對每一個成員也必須做類型說明,其形式爲:指針
類型說明符 成員名;code
成員名的命名應符合標識符的書寫規定。例如:對象
struct stu{ int num; char name[40]; char sex; float score; };
在這個結構定義中,結構名爲stu,該結構由4個成員組成。第一個成員爲num,整型變量;第二個成員爲name,字符數組;第三個成員爲sex,字符變量;第四個成員爲score,實型變量。應注意在括號後的分號是不可少的。結構定義以後,便可進行變量說明。凡說明爲結構stu的變量都由上述4個成員組成。因而可知,結構是一種複雜的數據類型,是數目固定,類型不一樣的若干有序變量的集合。blog
說明結構變量有如下三種方法。以上面定義的stu爲例來加以說明。內存
一、先定義結構,再說明結構變量。字符串
如:
struct stu{ int num; char name[40]; char sex; float score; }; struct stu boy1, boy2;
也能夠用宏定義使一個符號常量來表示一個結構類型。例如:
#define STU struct stu STU{ int num; char name[40]; char sex; float score; }; STU boy1, boy2;
例如:
struct stu{ int num; char name[40]; char sex; float score; }boy1, boy2;
這種形式的說明的通常形式爲:
struct 結構名{ 成員表列 }變量名錶列;
3) 直接說明結構變量。
例如:
struct{ int num; char name[40]; char sex; float score; }boy1, boy2;
struct{ 成員表列 }變量名錶列;
說明了boy一、boy2變量爲stu類型後,便可向這兩個變量中的各個成員賦值。在上述stu結構定義中,全部的成員都是基本數據類型或數組類型。成員也能夠又是一個結構,即構成了嵌套的結構。例如,下圖給出了另外一個數據結構。
按圖可給出如下結構定義:
struct date{ int month; int day; int year; }; struct{ int num; char name[40]; char sex; struct date birthday; float score; }boy1, boy2;
在程序中使用結構變量時,每每不把它做爲一個總體來使用。在ANSI C中除了容許具備相同類型的結構變量相互賦值之外,通常對結構變量的使用,包括賦值、輸入、輸出、運算等都是經過結構變量的成員來實現的。
表示結構變量成員的通常形式是:
結構變量名.成員名
例如:
boy1.num /*第一我的的學號*/ boy2.sex /*第二我的的性別*/
若是成員自己又是一個結構則必須逐級找到最低級的成員才能使用。例如:
boy1.birthday.month
結構變量的賦值就是給各成員賦值。可用輸入語句或賦值語句來完成。
例以下面的例子是給結構變量賦值並輸出其值。
#include <stdio.h> struct stu { int num; char *name; char sex; float score; }boy1, boy2 ; int main(void) { boy1.num = 100; boy1.name = "Zhang San"; printf("請輸入性別和分數:\n"); scanf("%c,%f", &boy1.sex, &boy1.score); boy2 = boy1; printf("學號:%d\n姓名:%s\n", boy2.num, boy2.name); printf("性別:%c\n分數:%f\n", boy2.sex, boy2.score); system("pause"); return 0; }運行結果:
本程序中用賦值語句給num和name兩個成員賦值,name是一個字符串指針變量。用scanf函數動態地輸入sex和score成員值,而後把boy1的全部成員的值總體賦予boy2。最後分別輸出boy2的各個成員值。本例表示告終構變量的賦值、輸入和輸出的方法。
與其餘類型變量同樣,也能夠給結構體的每一個成員賦初值,這稱爲結構體的初始化。一種是在定義結構體變量時進行初始化,語法格式以下:
struct 結構體名變量名={初始數據表};
另外一種是在定義結構體類型時進行結構體變量的初始化。
struct 結構體名 { 成員列表; }變量名={初始數據表};
說明
結構體類型與結構體變量概念不一樣
類型:不分配內存;變量:分配內存
類型:不能賦值、存取、運算;變量:能夠
結構體變量中的成員可單獨使用,方法如普通變量;
結構體可嵌套
結構體成員名與程序中變量名可相同
和其餘類型變量同樣,對結構變量能夠在定義時進行初始化賦值。
注意:
一、不能將一個結構體類型變量做爲一個總體加以引用,而只能對結構體類型變量中的各個成員分別引用。
二、若是成員自己又屬一個結構體類型,則要用若干個成員運算符,一級一級地找到最低的一級成員。只能對最低級的成員進行賦值或存取以及運算。
三、對成員變量能夠像普通變量同樣進行各類運算(根據其類型決定能夠進行的運算)。
四、在數組中,數組是不能彼此賦值的,而結構體類型變量能夠相互賦值。在C程序中,同一結構體類型的結構體變量之間容許相互賦值,而不一樣結構體類型的結構體變量之間不容許相互賦值,即便二者包含有一樣的成員。
下面的例子對結構變量初始化。
#include <stdio.h> struct stu { int num; char *name; char sex; float score; }boy1, boy2 = { 100, "Zhang San", 'M', 100 }; int main(void) { boy1 = boy2; printf("學號:%d\n姓名:%s\n", boy1.num, boy1.name); printf("性別:%c\n分數:%f\n", boy1.sex, boy1.score); system("pause"); return 0; }
運行結果:
本例中,boy二、boy1均被定義爲外部結構變量,並對boy1做了初始化賦值。在main函數中,把boy2的值總體賦予boy1,而後用兩個printf語句輸出boy1各成員的值。
結構是由若干數據項組合而成的複雜數據對象,這些數據項稱爲結構的成員。定義一個結構,須要給出各個成員的類型及名稱。結構定義僅描述了一個結構的形式。要在程序裏使用結構,須要聲明結構變量。訪問結構成員的操做要用圓點運算符(.),通常形式爲:結構變量名.成員名。