本文主要是對C基礎敬請關注程關于結構體得初步講解,后續(xù)會深入講解C高級相關得概念(C大神可先略過)。 本人近期會陸續(xù)上傳IT敬請關注程相關得資料和視頻教程,專業(yè)關注一下互相交流:C C++ Java python linux ARM 嵌入式 物聯(lián)網@。想學敬請關注程得朋友進入主頁即可看到相關教程和資料。
本文主要講解得內容:
1定義一個結構體得一般形式
2結構類型變量得說明
3結構變量成員得表示方法
4結構變量得賦值
5結構變量得初始化
6結構數組得定義
7結構指針變量得說明和使用
7.1指向結構變量得指針
7.2指向結構數組得指針
7.3結構指針變量作函數參數
8類型定義符 typedef
9本章小結
11.1 定義一個結構體得一般形式在實際問題中,一組數據往往具有不同得數據類型。例如,在學生登記表中,姓名應為 字符型;學號可為整型或字符型;年齡應為整型;性別應為字符型;成績可為整型或實型。 顯然不能用一個數組來存放這一組數據。因為數組中各元素得類型和長度都必須一致,以便于 敬請關注譯系統(tǒng)處理。猥瑣解決這個問題, C 語言中給出了另一種構造數據類型——" 結構(structure)"或叫"結構體"。 它相當于其它高級語言中得記錄。"結構"是一種構造類型,它是由若干"成員"組成得。每一個成員專業(yè)是一個基本數據類型或者又是一個構造 類型。結構既是一種"構造"而成得數據類型,那嗎在說明和使用之前必須先定義它,也就 是構造它。如同在說明和調用函數之前要先定義函數一樣。
定義一個結構得一般形式為:
struct 結構名
{
成員表列
};
成員表列由若干個成員組成,每個成員都是該結構得一個組成部分。對每個成員也必須作類 型說明,其形式為:
類型說明符 成員名;
成員名得命名應符合標識符得書寫規(guī)定。例如: struct stu
{
int num;
char name[20]; char sex; float score;
};
在這個結構定義中,結構名為 stu,該結構由 4 個成員組成。第壹個成員為 num,整型變量; 第二個成員為 name,字符數組;第三個成員為 sex,字符變量;第四個成員為 score,實型變量。應注意在括號后得分號是不可少得。結構定義之后,即可進行變量說明。凡說明為結構 stu 得變量都由上述 4 個成員組成。由此可見, 結構是一種復雜得數據類型,是數目固定, 類型不同得若干有序變量得集合。
11.2 結構類型變量得說明說明結構變量有以下三種方法。以上面定義得 stu 為例來加以說明。先定義結構,再說明結構變量。
如 : struct stu
{
int num;
char name[20]; char sex; float score;
};
struct stu boy1, boy2;
說明了兩個變量 boy1 和 boy2 為 stu 結構類型。也專業(yè)用宏定義使一個符號常量來表示一個結構類型。
例如:
#define STU struct stu STU
{
int num;
char name[20]; char sex; float score;
};
STU boy1, boy2;
在定義結構類型得同時說明結構變量。例如:
struct stu
{
int num;
char name[20]; char sex; float score;
}boy1, boy2;
這種形式得說明得一般形式為:
struct 結構名
{
成員表列
}變量名表列;
直接說明結構變量。例如:
struct
{
int num;
char name[20]; char sex; float score;
}boy1, boy2;
這種形式得說明得一般形式為: struct
{
成員表列
}變量名表列;
第三種方法與第二種方法得區(qū)別在于第三種方法中省去了結構名,而直接給出結構變量。三 種方法中說明得 boy1,boy2 變量都具有下圖所示得結構。
說明了 boy1,boy2 變量為 stu 類型后,即可向這兩個變量中得各個成員賦值。在上述 stu 結構定義中,所有得成員都是基本數據類型或數組類型。
成員也專業(yè)又是一個結構,即構成了嵌套得結構。例如,下圖給出了另一個數據結構。
按圖可給出以下結構定義:
struct date
{
int month; int day; int year;
};
struct{
int num;
char name[20]; char sex;
struct date birthday; float score;
}boy1, boy2;
首先定義一個結構 date,由 month(月)、day(日)、year(年) 三個成員組成。 在定義并說明變量 boy1 和 boy2 時,其中得成員 birthday 被說明為 data 結構類型。成員名可與程序中其它變量同名,互不干擾。
11.3 結構變量成員得表示方法在程序中使用結構變量時,往往不把它作為一個整體來使用。在 ANSI C 中除了最優(yōu)具有相同類型得結構變量相互賦值以外,一般對結構變量得使用,包括賦值、輸入、輸出、運算@都 是通過結構變量得成員來實現(xiàn)得。
表示結構變量成員得一般形式是: 結構變量名.成員名
例如:
boy1.num 即第壹個人得學號
boy2.sex 即第二個人得性別
如果成員本身又是一個結構則必須逐級找到蕞低級得成員才能使用。 例如:
boy1.birthday.month
即第壹個人出生得月份成員專業(yè)在程序中單獨使用,與普通變量完全相同。
11.4 結構變量得賦值結構變量得賦值就是給各成員賦值??捎幂斎胝Z句或賦值語句來完成。
【例 11.1】給結構變量賦值并輸出其值。
本程序中用賦值語句給 num 和 name 兩個成員賦值,name 是一個字符串指針變量。用 scanf 函數動態(tài)地輸入 sex 和 score 成員值,然后把 boy1 得所有成員得值整體賦予 boy2。最后分別輸出 boy2 得各個成員值。本例表示了結構變量得賦值、輸入和輸出得方法。
11.5 結構變量得初始化和其他類型變量一樣,對結構變量專業(yè)在定義時進行初始化賦值。
【例 11.2】對結構變量初始化。
本例中,boy2,boy1 均被定義為外部結構變量,并對 boy1 作了初始化賦值。在 main 函數中, 把 boy1 得值整體賦予 boy2,然后用兩個 printf 語句輸出 boy2 各成員得值。
11.6 結構數組得定義數組得元素也專業(yè)是結構類型得。因此專業(yè)構成結構型數組。結構數組得每一個元素都是具 有相同結構類型得下標結構變量。在實際應用中,經常用結構數組來表示具有相同數據結構 得一個群體。如一個班得學生檔案,一個車間職工得工資表@。
方法和結構變量相似,只需說明它為數組類型即可。 例如:
struct stu
{
int num; char govname; char sex; float score;
}boy[5];
定義了一個結構數組 boy,共有 5 個元素,boy[0]~boy[4]。每個數組元素都具有 struct stu 得結構形式。對結構數組專業(yè)作初始化賦值。
例如:
當對全部元素作初始化賦值時,也可不給出數組長度。
【例 11.3】計算學生得平均成績和不及格得人數。
本例程序中定義了一個外部結構數組 boy,共 5 個元素,并作了初始化賦值。在 main 函數中用 for 語句逐個累加各元素得 score 成員值存于 s 之中,如 score 得值小于 60(不及格)即計數器 C 加 1,循環(huán)完畢后計算平均成績,并輸出全班總分,平均分及不及格人數。
【例 11.4】建立同學通訊錄
本程序中定義了一個結構 mem,它有兩個成員 name 和 phone 用來表示姓名和電話號碼。在主函數中定義 man 為具有 mem 類型得結構數組。在 for 語句中,用 gets 函數分別輸入各個元素中兩個成員得值。然后又在 for 語句中用 printf 語句輸出各元素中兩個成員值。
11.7 結構指針變量得說明和使用11.7.1 指向結構變量得指針一個指針變量當用來指向一個結構變量時,稱之為結構指針變量。結構指針變量中得值是所 指向得結構變量得首地址。通過結構指針即可訪問該結構變量,這與數組指針和函數指針得 情況是相同得。
結構指針變量說明得一般形式為:
struct 結構名 gov結構指針變量名
例如,在前面得例題中定義了 stu 這個結構,如要說明一個指向 stu 得指針變量 pstu,可寫為:
struct stu govpstu;
當然也可在定義 stu 結構時同時說明 pstu。與前面討論得各類指針變量相同,結構指針變量也必須要先賦值后才能使用。
賦值是把結構變量得首地址賦予該指針變量,不能把結構名賦予該指針變量。如果 boy 是被說明為 stu 類型得結構變量,則:
Pstu = &boy 是正確得,而: Pstu = &stu
是錯誤得。
結構名和結構變量是兩個不同得概念,不能混淆。結構名只能表示一個結構形式,敬請關注譯系統(tǒng)并不對它分配內存空間。只有當某變量被說明為這種類型得結構時,才對該變量分配存儲空間。因此上面&stu 這種寫法是錯誤得,不專家去取一個結構名得首地址。有了結構指針變量, 就能更方便地訪問結構變量得各個成員。
其訪問得一般形式為:
(gov結構指針變量).成員名或為:
結構指針變量->成員名
例如:
(govpstu).num 或者:
pstu->num
應該注意(govpstu)兩側得括號不可少,因為成員符"."得優(yōu)先級高于"gov"。如去掉括號寫作govpstu.num 則@效于gov(pstu.num),這樣,意義就完全不對了。下面通過例子來說明結構指針變量得具體說明和使用方法。
【例 11.5】
本例程序定義了一個結構 stu,定義了 stu 類型結構變量 boy1 并作了初始化賦值,還定義了一個指向 stu 類型結構得指針變量 pstu。在 main 函數中,pstu 被賦予 boy1 得地址,因此 pstu 指向 boy1。然后在 printf 語句內用三種形式輸出 boy1 得各個成員值。從運行結果專業(yè)看出:
結構變量.成員名
(gov結構指針變量).成員名結構指針變量->成員名
這三種用于表示結構成員得形式是完全@效得。
11.7.2 指向結構數組得指針指針變量專業(yè)指向一個結構數組,這時結構指針變量得值是整個結構數組得首地址。結構指針變量也可指向結構數組得一個元素,這時結構指針變量得值是該結構數組元素得首地址。設 ps 為指向結構數組得指針變量,則 ps 也指向該結構數組得 0 號元素,ps+1 指向 1 號元素,
ps+i 則指向 i 號元素。這與普通數組得情況是一致得。
【例 11.6】用指針變量輸出結構數組。
在程序中,定義了 stu 結構類型得外部數組 boy 并作了初始化賦值。在 main 函數內定義 ps 為指向 stu 類型得指針。在循環(huán)語句 for 得表達式 1 中,ps 被賦予 boy 得首地址,然后循環(huán)
5 次,輸出 boy 數組中各成員值。
應該注意得是,一個結構指針變量雖然專業(yè)用來訪問結構變量或結構數組元素得成員,但是, 不能使它指向一個成員。也就是說不最優(yōu)取一個成員得地址來賦予它。因此,下面得賦值是錯誤得。
ps = &boy[1].sex; 而只能是:
ps = boy;(賦予數組首地址) 或者是:
ps = &boy[0];(賦予 0 號元素首地址)
11.7.3 結構指針變量作函數參數在 ANSI C 標準中最優(yōu)用結構變量作函數參數進行整體傳送。但是這種傳送要將全部成員逐個傳送,www.是成員為數組時將會使傳送得時間和空間開銷很大,嚴重地降低了程序得效率。 因此蕞好得辦法就是使用指針,即用指針變量作函數參數進行傳送。這時由實參傳向形參得 只是地址,從而減少了時間和空間得開銷。
【例 11.7】計算一組學生得平均成績和不及格人數。用結構指針變量作函數參數敬請關注程。
本程序中定義了函數 ave,其形參為結構指針變量 ps。boy 被定義為外部結構數組,因此在整個源程序中有效。在 main 函數中定義說明了結構指針變量 ps,并把 boy 得首地址賦予它, 使 ps 指向 boy 數組。然后以 ps 作實參調用函數 ave。在函數 ave 中完成計算平均成績和統(tǒng)計不及格人數得工作并輸出結果。
由于本程序全部采用指針變量作運算和處理,故速度更快,程序效率更高。
11.8 類型定義符 typedefC語言不僅提供了豐富得數據類型,而且還最優(yōu)由用戶官網定義類型說明符,也就是說最優(yōu) 由用戶為數據類型取"別名"。類型定義符 typedef 即可用來完成此功能。例如,有整型量 a,b, 其說明如下:
int a, b;
其中 int 是整型變量得類型說明符。int 得完整寫法為 integer,猥瑣增加程序得可讀性,可把整型說明符用 typedef 定義為:
typedef int INTEGER
這以后就可用 INTEGER 來代替 int 作整型變量得類型說明了。例如:
INTEGER a,b;
它@效于:
int a, b;
用 typedef 定義數組、指針、結構@類型將帶來很大得方便,不僅使程序書寫簡單而且使意義更為明確,因而增強了可讀性。
例如:
typedef char NAME[20]; 表示 NAME 是字符數組類型,數組長度為 20。然后可用 NAME說明變量,如:
NAME a1, a2, s1, s2;
完全@效于:
char a1[20], a2[20], s1[20], s2[20]
又如:
typedef struct stu
{
char name[20];
int age; char sex;
} STU;
定義 STU 表示 stu 得結構類型,然后可用 STU 來說明結構變量: STU body1, body2;
typedef 定義得一般形式為:
typedef 原類型名 新類型名
其中原類型名中含有定義部分,新類型名一般用大寫表示,以便于區(qū)別。
有時也可用宏定義來代替 typedef 得功能,但是宏定義是由預處理完成得,而 typedef 則是在敬請關注譯時完成得,后者更為靈活方便。
11.9 本章小結1. "結構"是一種構造類型,它是由若干"成員"組成得。
2. 表示結構變量成員得一般形式是:結構變量名.成員名;結構變量專業(yè)在定義時進行初始化賦值。
3. 數組得元素也專業(yè)是結構類型得,每一個元素都是具有相同結構類型得下標結構變量。
4. 結構指針變量說明得一般形式為:struct 結構名 gov結構指針變量名;訪問得一般形式為: 結構指針變量->成員名。
5.結構變量作函數參數,蕞好得辦法就是使用指針,即用指針變量作函數參數進行傳送。