當前位置:才華齋>計算機>C語言>

C語言的結構與聯合的例項分析

C語言 閱讀(9.74K)

引導語:結構體是由一系列具有相同型別或不同型別的資料構成的資料集合。以下是本站小編分享給大家的C語言的結構與聯合的例項分析,歡迎閱讀!

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各成員的值。