引導語:結構體是由一系列具有相同型別或不同型別的資料構成的資料集合。以下是本站小編分享給大家的C語言的結構與聯合的例項分析,歡迎閱讀!
結構型別定義和結構變數說明
在實際問題中,一組資料往往具有不同的資料型別。例如, 在學生登記表中,姓名應為字元型;學號可為整型或字元型; 年齡應為整型;性別應為字元型;成績可為整型或實型。 顯然不能用一個數組來存放這一組資料。 因為陣列中各元素的型別和長度都必須一致,以便於編譯系統處理。為了解決這個問題,C語言中給出了另一種構造資料型別——“結構”。 它相當於其它高階語言中的記錄。
“結構”是一種構造型別,它是由若干“成員”組成的。 每一個成員可以是一個基本資料型別或者又是一個構造型別。 結構既是一種“構造”而成的資料型別, 那麼在說明和使用之前必須先定義它,也就是構造它。如同在說明和呼叫函式之前要先定義函式一樣。
一、結構的定義
定義一個結構的一般形式為:
struct 結構名
{
成員表列
};
成員表由若干個成員組成, 每個成員都是該結構的一個組成部分。對每個成員也必須作型別說明,其形式為:
型別說明符 成員名;
成員名的命名應符合識別符號的書寫規定。例如:
struct stu
{
int num;
char name[20];
char sex;
float score;
};
在這個結構定義中,結構名為stu,該結構由4個成員組成。 第一個成員為num,整型變數;第二個成員為name,字元陣列;第三個成員為sex,字元變數;第四個成員為score,實型變數。 應注意在括號後的分號是不可少的。結構定義之後,即可進行變數說明。 凡說明為結構stu的變數都由上述4個成員組成。由此可見, 結構是一種複雜的資料型別,是數目固定,型別不同的若干有序變數的集合。
二、結構型別變數的說明
說明結構變數有以下三種方法。以上面定義的stu為例來加以說明。
1. 先定義結構,再說明結構變數。如:
struct stu
{
int num;
char name[20];
char sex;
float score;
};
struct stu boy1,boy2;
說明了兩個變數boy1和boy2為stu結構型別。也可以用巨集定義使一個符號常量來表示一個結構型別,例如:
#define STU struct stu
STU
{
int num;
char name[20];
char sex;
float score;
};
STU boy1,boy2;
2. 在定義結構型別的同時說明結構變數。例如:
struct stu
{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;
3. 直接說明結構變數。例如:
struct
{
int num;
char name[20];
char sex;
float score;
}boy1,boy2;
第三種方法與第二種方法的區別在於第三種方法中省去了結構名,而直接給出結構變數。三種方法中說明的boy1,boy2變數都具有圖1.1所示的結構。說明了boy1,boy2變數為stu型別後,即可向這兩個變數中的各個成員賦值。在上述stu結構定義中,所有的成員都是基本資料型別或陣列型別。成員也可以又是一個結構, 即構成了巢狀的結構。例如,圖1.2給出了另一個數據結構。 按圖1.2可給出以下結構定義:
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結構型別。成員名可與程式中其它變數同名,互不干擾。結構變數成員的表示方法在程式中使用結構變數時, 往往不把它作為一個整體來使用。
在ANSI C中除了允許具有相同型別的結構變數相互賦值以外, 一般對結構變數的使用,包括賦值、輸入、輸出、 運算等都是通過結構變數的成員來實現的。
表示結構變數成員的一般形式是: 結構變數名.成員名 例如: 即第一個人的學號 即第二個人的性別 如果成員本身又是一個結構則必須逐級找到最低階的成員才能使用。例如:h 即第一個人出生的月份成員可以在程式中單獨使用,與普通變數完全相同。
結構變數的賦值
前面已經介紹,結構變數的賦值就是給各成員賦值。 可用輸入語句或賦值語句來完成。
[例1.1]給結構變數賦值並輸出其值。
main(){
struct stu
{
int num;
char *name;
char sex;
float score;
} boy1,boy2;
=102;
="Zhang ping";
printf("input sex and score ");
scanf("%c %f",&,&e);
boy2=boy1;
printf("Number=%d Name=%s ",,);
printf("Sex=%c Score=%f ",,e);
}
struct stu
{
int num;
char *name;
char sex;
float score;
}boy1,boy2;
=102;
="Zhang ping";
printf("input sex and score ");
scanf("%c %f",&,&e);
boy2=boy1;
printf("Number=%d Name=%s ",,);
printf("Sex=%c Score=%f ",,e);
本程式中用賦值語句給num和name兩個成員賦值,name是一個字串指標變數。用scanf函式動態地輸入sex和score成員值,然後把boy1的所有成員的值整體賦予boy2。最後分別輸出boy2 的各個成員值。本例表示了結構變數的賦值、輸入和輸出的方法。
結構變數的初始化
如果結構變數是全域性變數或為靜態變數, 則可對它作初始化賦值。對區域性或自動結構變數不能作初始化賦值。
[例1.2]外部結構變數初始化。
struct stu /*定義結構*/
{
int num;
char *name;
char sex;
float score;
} boy2,boy1={102,"Zhang ping",'M',18.5};
main()
{
boy2=boy1;
printf("Number=%d Name=%s ",,);
printf("Sex=%c Score=%f ",,e);
}
struct stu
{
int num;
char *name;
char sex;
float score;
}boy2,boy1={102,"Zhang ping",'M',18.5};
main()
{
boy2=boy1;
……
}
本例中,boy2,boy1均被定義為外部結構變數,並對boy1作了初始化賦值。在main函式中,把boy1的值整體賦予boy2, 然後用兩個printf語句輸出boy2各成員的值。