第十一章結構體

2021-03-04 09:39:16 字數 4073 閱讀 2859

第十一章結構體、共用體和使用者定義型別

c語言中的整型、實型、字元型等基本資料型別適合於簡單問題的資料處理,當遇到複雜的資料關係時很難用簡單的資料型別來描述,為此,c語言提供了幾種專門處理複雜資料關係的資料型別,即結構體、共用體和列舉型別。

11.1 結構體型別

在前面的章節中,全面地介紹了c語言提供的幾種基本資料型別,如int、float、char、double等,這些基本的資料型別在處理簡單的單一資料時是十分方便的,而且在處理一組相同資料型別的資料時,只要利用c語言中陣列的概念,將它們組織成乙個資料集合,就可以很方便地對它們進行引用和操作。但是在實際的應用中,經常會遇到所需處理的一批資料,並不具有完全相同的資料型別的特徵。例如處理有關學生的資訊時,應該將某一位學生的姓名、性別、學號、年齡、課程成績等作為乙個有機整體來處理。

觀察一下這些資料就會發現,雖然它們同是描述某一位學生情況的資料,但是,這一組資料是由多個具有不同型別的資料所組成,如表11.1所示。

表11.1 學生資訊的組成

在處理這種形式的資料時,如果僅使用前面介紹過的幾種基本資料型別來操作,那麼只能將這些資料一一割裂開來單獨地進行處理,這種處理方式會大大降低資料的處理效率。為此,在c語言中引入了一種專門組織和處理複雜關係的資料型別,即結構體型別。

11.1.1結構體型別的定義

結構體型別定義的一般形式:

struct 結構體名

;其中,struct 是結構體型別定義的關鍵字,是英文單詞structure的縮寫形式。「結構體名」是使用者自定義的結構體型別識別符號,也稱為結構體型別名。「struct 結構體名」作為乙個整體與c語言的基本資料型別具有同樣的地位和作用。

花括號中的結構體成員表定義了此結構體內所包含的每乙個成員的型別,它們組成了乙個結構體。結構體名和結構體成員名的命名規則與簡單變數名的命名規則相同。

注意:在書寫結構體型別定義時,不要忽略最後的分號。

例如,對錶11.1所描述的資料形式可定義如下的結構體型別:

struct student

; 經過以上定義,即向編譯系統宣告使用者定義了乙個「結構體型別」,結構體名為student,該結構體的全體成員包括num、name、***、age和score,它們在結構體中被依次作了型別定義。結構體成員的型別既可以是基本資料型別,也可以是構造型別或者指標型別。

結構體型別定義僅僅是對一種特定的資料結構的描述,使用者為了建立和描述不同的資料結構模型,可以定義不同形式的結構體,並由不同的結構體名來標識。結構體型別一旦建立,就規定了該結構體自身所占用儲存空間的儲存模型,除此之外,它不含有任何具體的資料內容,所以系統在編譯此段**時,並不為它分配實際的儲存空間。

11.1.2結構體型別變數的定義

結構體型別變數(簡稱結構體變數)的定義有3種方式。

1.先定義結構體型別,再定義結構體變數

一般形式如下:

struct 結構體名

;struct 結構體名結構體變數名錶;

例如:struct student

;struct student student1,student2;

即在定義了結構體型別struct student後,利用該型別定義兩個變數student1與student2。一旦定義了結構體變數,就按照結構體型別的組成,系統為定義的結構體變數分配記憶體單元。結構體變數的各個成員在記憶體中占用連續儲存區域,結構體變數所佔記憶體大小為結構體中每個成員所占用記憶體的長度之和。

如上面定義的結構體變數student1在記憶體中的儲存情況如圖11.1所示(假定int型占用2個位元組,如在turbo c中)。

圖11.1 結構體變數的記憶體儲存示意圖

這裡特別提醒注意的是:在定義結構體型別時並不分配記憶體空間,只有在定義結構體變數後才分配實際的儲存空間。

2.在定義結構體型別的同時定義結構體變數

一般形式如下:

struct 結構體名

結構體變數名錶;

例如:struct student

student1,student2;

即在定義結構體型別struct student的同時定義了該型別的兩個變數student1,student2。

3.在定義結構體型別時省略結構體名,直接定義結構體變數

一般形式如下:

struct

結構體變數名錶;

例如:struct

student1, student2;

這時student1,student2也稱為匿名結構體型別變數。

注意:在匿名結構體的定義中結構體變數名錶是不能缺少的,並且在程式中不能再定義相同型別的其它結構體變數。

c語言也允許結構體中的某個成員是另乙個結構體型別的變數,即結構體型別可以巢狀定義。如表11.2也是學生資訊的一種形式,它組成乙個結構體,在它的內部有乙個變數(出生日期)也自成乙個結構體。

表11.2 學生資訊的組成

對錶11.2的資料形式可以有如下的結構體型別定義:

struct date

;struct stud

;也可以採用結構體型別的巢狀定義形式。如:

struct stud

birthday;

float score;

};如有以下定義:

struct stud student3;

則結構體變數student3在記憶體的儲存情況如圖11.2所示。

圖11.2 結構體型別巢狀時的結構體變數記憶體儲存示意圖

11.1.3 結構體變數的引用

結構體變數引用的一般方式為:

結構體變數名.成員名

「.」被稱為成員運算子,它在所有的運算子中優先順序最高。所以可以把「結構體變數名.成員名」作為乙個整體看待。

如: student3.score=94.5;

strcpy( "ye wenjuan");

如果成員變數又是結構體型別,必須一級一級地找到最低階成員變數,然後對其進行引用。如:

student3.brithday.year=1985;

student3.brithday.month=2;

student3.brithday.day=20;

結構體變數的成員所能進行的運算與同型別的普通變數相同。如:

studenr2.score=student1.score;

sum=student1.score+student2.score;

student1.age++;

scanf(「%d」,&student1.age);

同型別的結構體變數可以直接賦值。如:

studenr2=student1;

11.1.4 結構體變數的初始化

結構體變數的初始化是指在定義結構體變數的同時為其成員變數賦初值。

例11.1初始化結構體變數並輸出相應的資訊。

#include

struct date

;struct stud

;main

, 94};

struct stud stud2=stud1;

stud2.score=99;

printf("no.:%s\n",stud1.num);

printf("name:%s\n",

printf("***:%c\n",stud1.***);

printf("birthday: year:%4d month:%2d day:%2d\n",stud1.birthday.year,

stud1.birthday.month,stud1.birthday.day);

printf("stud1 score:%5.1f\n",stud1.score);

printf("stud2 score:%5.1f\n",stud2.score);

}程式執行結果如下:

no.:200608247

name:ye wenjuan

***:f

birthday: year:1988 month: 3 day:15

stud1 score: 94.0

stud2 score: 99.0

在例11.1中先初始化結構體變數stud1,再利用已有值的結構體變數stud1去初始化另乙個結構體變數stud2。

初始化資料的資料型別及順序要和結構體型別定義中的結構體成員相匹配。如果初始化資料中包含多個結構體成員的初值,則這些初值之間要用逗號分隔。可以同時對多個結構體變數進行初始化,它們之間也是用逗號來分隔。

第十一章結構體與共用體程式設計

實驗時間 2009年6月1日實驗地點 實驗人專業班級 實驗題目 結構體 共用體的設計 實驗目的 通過實驗熟悉結構體 共用體與列舉型別的使用。實驗過程 一 課例 例11.1對結構體變數初始化 main a 單個字元單引號,字串雙引號 printf no.ld nname s n c naddress ...

第十一章配合物結構

11 6 內軌型 外軌型的概念是配合物價鍵理論中的概念 高自旋和低自旋的概念屬於晶體長理論的範疇。如果某八面體配合物按價鍵理論是內軌型的,則按晶體場理論往往是低自旋型的,即形成體的未成對電子數n盡可能的小。同樣,外軌型與高自旋型是相對應的,形成體的未成對電子數在形成配合物前後不改變。1 ru2 的價...

第十一章熱學

一 擴散 不同物質相互接觸時彼此進入對方的現象 意義 分子永不停息的做無規則的運動,而且溫度越高,擴散越快。固體 液體也有擴散現象 二 布朗運動1827年 英 布朗首先用顯微鏡觀察水中的花粉時發現的,稱為布朗運動。1 運動是無規則的 2 顆粒體積越小越明顯,質量越小越明顯 3 溫度越高越明顯 4 氣...