C++程序設計教程-第7章結構體與共用體_第1頁
C++程序設計教程-第7章結構體與共用體_第2頁
C++程序設計教程-第7章結構體與共用體_第3頁
C++程序設計教程-第7章結構體與共用體_第4頁
C++程序設計教程-第7章結構體與共用體_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、C+程序設計湖南大學 杜四春、銀紅霞 第7章 結構體與共用體 7.1 結構體的概念 7.2 結構體類型變量的定義方法 7.3 結構體變量的使用形式和初始化 7.4 結構體數(shù)組 7.5 結構體與指針 7.6 結構體與函數(shù) 7.7 共用體 C+程序設計湖南大學 杜四春、銀紅霞在實際的處理對象中,有許多信息是由多個不同類型的數(shù)據(jù)組合在一起進行描述,而且這些不同類型的數(shù)據(jù)是互相聯(lián)系組成了一個有機的整體。此時,就要用到一種新的構造類型數(shù)據(jù)結構體structure),簡稱結構。結構體的使用為處理復雜的數(shù)據(jù)結構如動態(tài)數(shù)據(jù)結構等提供了有效的手段,而且,它們?yōu)楹瘮?shù)間傳遞不同類型的數(shù)據(jù)提供了方便。同時也介紹在相同

2、存儲區(qū)域內(nèi)存儲不同數(shù)據(jù)類型的構造類型共用體也稱聯(lián)合體的相關概念。 C+程序設計湖南大學 杜四春、銀紅霞7.1 結構體的概念結構體是用戶自定義的新數(shù)據(jù)類型,在結構體中可以包含若干個不同數(shù)據(jù)類型和不同意義的數(shù)據(jù)項當然也可以相同),從而使這些數(shù)據(jù)項組合起來反映某一個信息。結構體相當于COBOL 和PASCAL等高級語言中的“記錄” 。例如,可以定義一個職工worker結構體,在這個結構體中包括職工編號、姓名、性別、年齡、工資、家庭住址、聯(lián)系電話。這樣就可以用一個結構體數(shù)據(jù)類型的變量來存放某個職工的所有相關信息。并且,用戶自定義的數(shù)據(jù)類型worker也可以與int、double等基本數(shù)據(jù)類型一樣,用來

3、作為定義其他變量的數(shù)據(jù)類型。 C+程序設計湖南大學 杜四春、銀紅霞定義一個結構體類型的一般形式為:struct 結構體名數(shù)據(jù)類型成員名1;數(shù)據(jù)類型成員名2;:數(shù)據(jù)類型成員名n;在大括號中的內(nèi)容也稱為“成員表列或“域表”。其中,每個成員名的命名規(guī)則與變量名相同;數(shù)據(jù)類型可以是基本變量類型和數(shù)組類型,也可以是指針變量類型,或者是一個結構體類型;用分號“;”作為結束符。整個結構的定義也用分號作為結束符, C+程序設計湖南大學 杜四春、銀紅霞例如:定義一個職工worker結構體如下:struct worker long number; char name20; char sex; /sex是成員名 i

4、nt age; float salary; char address80; char phone20; ; /注意分號不要省略int sex=10; /sex是變量名 C+程序設計湖南大學 杜四春、銀紅霞結構體類型中的成員名可以與程序中的變量名相同,二者并不代表同一對象,編譯程序可以自動對它們進行區(qū)分。 最后,總結一下結構體類型的特點:(1結構體類型是用戶自行構造的。(2它由若干不同的基本數(shù)據(jù)類型的數(shù)據(jù)構成。(3它屬于C+語言的一種數(shù)據(jù)類型,與整型、實型相當。因而,定義它時不分配空間,只有用它定義變量時才分配空間。 C+程序設計湖南大學 杜四春、銀紅霞7.2 結構體類型變量的定義方法結構體只是

5、用戶自定義的一種數(shù)據(jù)類型,因此要通過定義結構體類型的變量來使用這種類型。通常有三種形式來定義一個結構體類型變量,分別說明如下:7.2.1 先定義結構體類型再定義變量名這是C+語言中定義結構體類型變量最常見的方式,一般語法格式如下:struct 結構體名 成員表列;struct 結構體名 變量名;C+程序設計湖南大學 杜四春、銀紅霞例如,定義幾個職工變量:struct worker long number; char name20; char sex; int age; float salary; char address80; char phone20; struct worker worke

6、r1,worker2; C+程序設計湖南大學 杜四春、銀紅霞注意:“struct worker代表類型名,不能分開寫為:s t r u c t w o r k e r 1 , w o r k e r 2 ; /錯誤,沒有指明是哪種結構體類型或worker worker1,worker2; /錯誤,沒有struct關鍵字/系統(tǒng)不認為worker是結構體類型 為了使用上的方便,程序員通常用一個符號常量代表一個結構體類型。即在程序開頭加上下列語句:#define WORKER struct worker;這樣在程序中,WORKER與struct worker完全等效。 C+程序設計湖南大學 杜四春、

7、銀紅霞例如:WORKER long number; char name20; char sex; int age; float salary; char address80; char phone20; ;WORKER worker1,worker2;此時,可以直接用WORKER定義worker1、worker2兩個變量,而不必再寫關鍵字struct。C+程序設計湖南大學 杜四春、銀紅霞如果程序規(guī)模比較大,往往將對結構體類型的定義集中寫入到一個頭文件以.h為后綴中。哪個源文件需用到此結構體類型則可用#include命令將該文件包含到本文件中。這樣做便于程序的修改和使用。 7.2.2 在定義類型

8、的同時定義變量這種形式的定義的一般形式為:struct 結構體名 成員表列;變量名; C+程序設計湖南大學 杜四春、銀紅霞例如:struct worker long number; char name20; char sex; int age; float salary; char address80; char phone20; worker1,worker2; 此例與前例作用相同,都定義了兩個變量worker1、worker2,它們是結構體類型struct worker。 C+程序設計湖南大學 杜四春、銀紅霞7.2.3 直接定義結構類型變量直接定義結構類型變量其一般形式為:其一般形式為:s

9、truct /沒有結構體名沒有結構體名 成員表列成員表列 變量名;變量名; C+程序設計湖南大學 杜四春、銀紅霞例如:struct long number; char name20; char sex; int age; float salary; char address80; char phone20; worker1,worker2; C+程序設計湖南大學 杜四春、銀紅霞一個結構體變量占用內(nèi)存的實際大小,也可以利用sizeof運算求出。它的運算表達式為:sizeof運算量) /求出給定的運算量占用內(nèi)存空間的字節(jié)數(shù)其中運算量可以是變量、數(shù)組或結構體變量,也可以是數(shù)據(jù)類型的名稱。 例如:si

10、zeof(struct worker)sizeof(worker1) C+程序設計湖南大學 杜四春、銀紅霞7.3 結構體變量的使用形式和初始化7.3.1 結構體變量的使用形式結構體變量的使用形式在定義了結構體變量以后,就可以使用這在定義了結構體變量以后,就可以使用這個變量。結構體變量是不同數(shù)據(jù)類型的若干數(shù)個變量。結構體變量是不同數(shù)據(jù)類型的若干數(shù)據(jù)的集合體。在程序中使用結構體變量時,一據(jù)的集合體。在程序中使用結構體變量時,一般情況下不能把它作為一個整體參加數(shù)據(jù)處理,般情況下不能把它作為一個整體參加數(shù)據(jù)處理,而參加各種運算和操作的是結構體變量的各個而參加各種運算和操作的是結構體變量的各個成員項數(shù)據(jù)

11、。成員項數(shù)據(jù)。結構體變量的成員用以下一般形式表示:結構體變量的成員用以下一般形式表示:結構體變量名結構體變量名.成員名成員名例如,上節(jié)給出的結構體變量例如,上節(jié)給出的結構體變量worker1具具有下列七個成員:有下列七個成員:worker1.number;;worker1.sex;worker1.age;worker1.salary;worker1.address;worker1.phone C+程序設計湖南大學 杜四春、銀紅霞在定義了結構體變量后,就可以用不同的賦值方法對結構體變量的每個成員賦值。例如:strcpy(,”Zhang San”);

12、worker1.age=26;strcpy(worker1.phone,”1234567”);worker1.sex=m; : :除此之外,還可以引用結構體變量成員的地址以及成員中的元素。例如:引用結構體變量成員的首地址&;引用結構體變量成員的第二個字符1;引用結構體變量的首地址&worker1。 C+程序設計湖南大學 杜四春、銀紅霞在使用結構體類型變量時有以下幾點需要加以注意:(1不能將一個結構體類型變量作為一個整體加以引用,而只能對結構體類型變量中的各個成員分別引用。例如,對上面定義的結構體類型變量wan,下列引用都是錯誤的:

13、coutwan;但是可以如下引用:; C+程序設計湖南大學 杜四春、銀紅霞(2如果成員本身又屬一個結構體類型,則要用若干個成員運算符,一級一級地找到最低的一級成員。只能對最低級的成員進行賦值或存取以及運算。例如,對上面定義的結構體類型變量worker1,可以這樣訪問各成員:worker1.birthday. yearworker1.birthday. monthworker1.birthday. day注意:不能用worker1.birthday來訪問worker1變量中的成員birthday,因為birthday本身是一個

14、結構體變量。 C+程序設計湖南大學 杜四春、銀紅霞(3對成員變量可以像普通變量一樣進行各種運算根據(jù)其類型決定可以進行的運算)。例如:worker2.age=worker1.age;sum=worker1.age+worker2.age;worker1.age+;(4在數(shù)組中,數(shù)組是不能彼此賦值的,而結構體類型變量可以相互賦值。 在C+程序中,同一結構體類型的結構體變量之間允許相互賦值,而不同結構體類型的結構體變量之間不允許相互賦值,即使兩者包含有同樣的成員。 C+程序設計湖南大學 杜四春、銀紅霞7.3.2 結構體變量的初始化結構體變量的初始化與其他類型變量一樣,也可以給結構體的與其他類型變量一

15、樣,也可以給結構體的每個成員賦初值,這稱為結構體的初始化。有每個成員賦初值,這稱為結構體的初始化。有兩種初始化形式,一種是在定義結構體變量時兩種初始化形式,一種是在定義結構體變量時進行初始化,一般語法格式如下:進行初始化,一般語法格式如下:struct 結構體名結構體名 變量名變量名=初始數(shù)據(jù)表初始數(shù)據(jù)表;另一種是在定義結構體類型時進行結構體另一種是在定義結構體類型時進行結構體變量的初始化。一般語法格式如下:變量的初始化。一般語法格式如下:struct 結構體名結構體名 成員表列;成員表列;變量名變量名=初始數(shù)據(jù)表初始數(shù)據(jù)表; C+程序設計湖南大學 杜四春、銀紅霞例如,前述student結構體

16、類型的結構體變量wan在說明時可以初始化如下:struct student wan=”Wan Jun”,m,20,” SuZhou Road No.100”;它所實現(xiàn)的功能,與下列分別對結構體變量的每個成員賦值所實現(xiàn)的功能相同:strcpy(,” Wan Jun”);wan.sex=m;wan.age=20;wan.addr=” SuZhou Road No.100”; C+程序設計湖南大學 杜四春、銀紅霞與數(shù)組的初始化特性相同,結構體的初始化僅限于外部的和static型結構體。也就是說,在函數(shù)內(nèi)部對結構體進行初始化時,必須指定該結構體為static型。對缺省存儲類型的auto

17、型結構體不能在函數(shù)內(nèi)部對它們進行初始化。 C+程序設計湖南大學 杜四春、銀紅霞7.4 結構體數(shù)組具有相同結構體類型的結構體變量也可以組成數(shù)組,稱它們?yōu)榻Y構體數(shù)組。結構體數(shù)組的每一個數(shù)組元素都是結構體類型的數(shù)據(jù),它們都分別包括各個成員分量項。7.4.1 結構體數(shù)組的定義定義結構體數(shù)組的方法和定義結構體變量的方法相仿,只需說明其為數(shù)組即可。可以采用三種方法: C+程序設計湖南大學 杜四春、銀紅霞1. 先定義結構體類型,再用它定義結構體數(shù)組。先定義結構體類型,再用它定義結構體數(shù)組。結構體數(shù)組的定義形式如下:結構體數(shù)組的定義形式如下:struct 結構體名結構體名 成員表列;成員表列;struct 結

18、構體名結構體名 例如:struct student char name20; char sex; int age; char addr20;struct student stu3; C+程序設計湖南大學 杜四春、銀紅霞2. 在定義結構體類型同時定義結構體數(shù)組。在定義結構體類型同時定義結構體數(shù)組。結構體數(shù)組的定義形式如下:結構體數(shù)組的定義形式如下:struct 結構體名結構體名 成員表列;成員表列;數(shù)組名數(shù)組名元素個數(shù)元素個數(shù);例如:struct student char name20; char sex; int age; char addr20;stu3; C+程序設計湖南大學 杜四春、銀紅

19、霞3. 直接定義結構體數(shù)組直接定義結構體數(shù)組結構體數(shù)組的定義形式如下:結構體數(shù)組的定義形式如下:struct /沒有結構體名沒有結構體名 成員表列;成員表列;數(shù)組名數(shù)組名元素個數(shù)元素個數(shù); 例如:struct char name20; char sex; int age; char addr20;stu3; C+程序設計湖南大學 杜四春、銀紅霞結構體數(shù)組名表示該結構體數(shù)組的存儲首地址。結構體數(shù)組適合于處理由若干具有相同關系的數(shù)據(jù)組成的數(shù)據(jù)集合體。用結構體數(shù)組處理數(shù)據(jù)時可以使用循環(huán),從而使程序十分簡煉。C+程序設計湖南大學 杜四春、銀紅霞7.4.2 結構體數(shù)組的初始化結構體數(shù)組的初始化結構體數(shù)組

20、在定義的同時也可以進行初始結構體數(shù)組在定義的同時也可以進行初始化,并且與結構體變量的初始化規(guī)定相同,只化,并且與結構體變量的初始化規(guī)定相同,只能對全局的或靜態(tài)存儲類別的結構體數(shù)組初始能對全局的或靜態(tài)存儲類別的結構體數(shù)組初始化。化。結構體數(shù)組初始化的一般形式是:結構體數(shù)組初始化的一般形式是:struct 結構體名結構體名 成員表列;成員表列;struct 結構體名結構體名 數(shù)組名數(shù)組名元素個數(shù)元素個數(shù)=初始數(shù)據(jù)初始數(shù)據(jù)表表;C+程序設計湖南大學 杜四春、銀紅霞或者:struct 結構體名 成員表列;數(shù)組名元素個數(shù)=初始數(shù)據(jù)表; 在對結構體數(shù)組進行初始化時,方括號 中元素個數(shù)可以不指定。編譯時,系

21、統(tǒng)會根據(jù)給出初始的結構體常量的個數(shù)來確定數(shù)組元素的個數(shù)。由于結構體變量是由若干不同類型的數(shù)據(jù)組成,而結構體數(shù)組又是由若干結構體變量組成。所以要特別注意包圍在大括號中的初始數(shù)據(jù)的順序,以及它們與各個成員項間的對應關系。C+程序設計湖南大學 杜四春、銀紅霞7.4.3 結構體數(shù)組的使用結構體數(shù)組的使用一個結構體數(shù)組的元素相當于一個結構體一個結構體數(shù)組的元素相當于一個結構體變量,因此前面介紹的有關結構體變量的規(guī)則變量,因此前面介紹的有關結構體變量的規(guī)則也適應于結構體數(shù)組元素。以上面定義的結構也適應于結構體數(shù)組元素。以上面定義的結構體數(shù)組體數(shù)組stu3為例說明對結構體數(shù)組的引用:為例說明對結構體數(shù)組的引

22、用:(1引用某一元素中的成員。引用某一元素中的成員。若要引用數(shù)組第二個元素的若要引用數(shù)組第二個元素的name成員,則成員,則可寫為:可寫為:若數(shù)組已如前所示進行了初始化,則若數(shù)組已如前所示進行了初始化,則的值為的值為“Liu Yong”。C+程序設計湖南大學 杜四春、銀紅霞(2可以將一個結構體數(shù)組元素值賦給同一結構體類型的數(shù)組中的另一個元素,或賦給同一類型的變量。如:struct student stu3,student1;現(xiàn)在定義了一個結構體類型的數(shù)組,它有3個元素,又定義了一個結構體類型變量student1,則下面的賦值是合法的。student1=stu

23、0;stu0=stu1;stu1=student1; C+程序設計湖南大學 杜四春、銀紅霞(3不能把結構體數(shù)組元素作為一個整體直接進行輸入輸出。如:coutstu0;都是錯誤的。只能以單個成員為對象進行輸入輸出,如:;cinstu1.num;;cout成員名它與前一種表示方法在意義上是完全等價的。例如,結構體指針p指向的結構體變量中的成員name可以表示如下:(*p).name 或 p-name 在后種表示方法中,“-”(減號和大于號也是一種運算符。從表2-4中看出,它在第一運算優(yōu)先級中。它表示的運算意義是,訪問指針指向的結構體變量中的成員。

24、C+程序設計湖南大學 杜四春、銀紅霞7.5.2 結構體數(shù)組指針結構體數(shù)組指針在在C+語言中,把指向結構體數(shù)組或數(shù)組語言中,把指向結構體數(shù)組或數(shù)組元素的指針稱為結構體數(shù)組指針。元素的指針稱為結構體數(shù)組指針。 例例7-7 C+程序設計湖南大學 杜四春、銀紅霞7.5.3 結構體指針數(shù)組結構體指針數(shù)組在一個數(shù)組中,若每個元素都是一個結構在一個數(shù)組中,若每個元素都是一個結構體指針,則稱為結構體指針數(shù)組。體指針,則稱為結構體指針數(shù)組。 例例7-8 C+程序設計湖南大學 杜四春、銀紅霞7.6 結構體與函數(shù)在調用函數(shù)時,可以把結構體變量的值作為參數(shù)傳遞給函數(shù)。由于結構體是多個數(shù)據(jù)的集合體,當把它們傳遞給函數(shù)時

25、,C+的編譯系統(tǒng)不允許把結構體變量整體作為一個參數(shù)傳遞到函數(shù)中去。因而,只能把每個結構體變量的成員作為一個個的參數(shù)傳遞到函數(shù)中去。例如,用或stu2.age作函數(shù)實參,將實參值傳給形參。這種用法和用普通變量作實參是一樣的,屬“值傳遞方式。這種方式一般不常用。一種常用的方式是,與數(shù)組在函數(shù)間傳遞一樣,結構體傳遞給函數(shù)時,一般采用地址傳遞方式,即把結構體變量或數(shù)組的存儲地址作為參數(shù)向函數(shù)傳遞,函數(shù)中用指向相同結構體類型的指針接收該地址值。然后,在函數(shù)中通過這個結構體指針來處理結構體變量或數(shù)組中的各項數(shù)據(jù)。 C+程序設計湖南大學 杜四春、銀紅霞7.6.1 傳遞結構值傳遞結構值結構體

26、可以按值傳遞,這種情況下整個結結構體可以按值傳遞,這種情況下整個結構值都將被復制到形參中去。構值都將被復制到形參中去。 例例7-9 C+程序設計湖南大學 杜四春、銀紅霞7.6.2 傳遞結構體的引用傳遞結構體的引用結構體也可以引用傳遞,這種情況下僅僅結構體也可以引用傳遞,這種情況下僅僅把結構體變量地址傳遞給形參。引用傳遞效率把結構體變量地址傳遞給形參。引用傳遞效率較高,因為它不用傳遞整個結構體變量的值,較高,因為它不用傳遞整個結構體變量的值,節(jié)省了傳遞的時間和空間。節(jié)省了傳遞的時間和空間。例例7-10 C+程序設計湖南大學 杜四春、銀紅霞7.6.3 傳遞結構體的指針傳遞結構體的指針結構體變量或數(shù)

27、組的值也可以通過結結構體變量或數(shù)組的值也可以通過結構體指針傳遞,但程序的可讀性比引用傳遞要構體指針傳遞,但程序的可讀性比引用傳遞要差一些。差一些。例例7-11 C+程序設計湖南大學 杜四春、銀紅霞7.7 共用體7.7.1 共用體的概念共用體的概念在在C+語言中,不同數(shù)據(jù)類型的數(shù)據(jù)可以語言中,不同數(shù)據(jù)類型的數(shù)據(jù)可以使用共同的存儲區(qū)域,這種數(shù)據(jù)構造類型稱為使用共同的存儲區(qū)域,這種數(shù)據(jù)構造類型稱為共用體,簡稱共用,又稱聯(lián)合體。共用體在定共用體,簡稱共用,又稱聯(lián)合體。共用體在定義、說明和使用形式上與結構體相似。兩者本義、說明和使用形式上與結構體相似。兩者本質上的不同僅在于使用內(nèi)存的方式上。質上的不同僅

28、在于使用內(nèi)存的方式上。 定義一個共用體類型的一般形式為:定義一個共用體類型的一般形式為:union 共用體名共用體名成員表列;成員表列; C+程序設計湖南大學 杜四春、銀紅霞例如:union gyint i;char c;float f;就定義了一個共用體類型union gy,它由三個成員組成,這三個成員在內(nèi)存中使用共同的存儲空間。由于共用體中各成員的數(shù)據(jù)長度往往不同,所以共用體變量在存儲時總是按其成員中數(shù)據(jù)長度最大的成員占用內(nèi)存空間。如上述共用體類型union gy的變量占用4個字節(jié)的內(nèi)存。C+程序設計湖南大學 杜四春、銀紅霞在這一點上共用體與結構體不同,結構體類型變量在存儲時總是按各成員的

29、數(shù)據(jù)長度之和占用內(nèi)存空間。例如,定義了一個結構體類型:struct gyint i;char c;float f;則結構體類型struct gy的變量占用的內(nèi)存為2+1+4=7個字節(jié) 。C+程序設計湖南大學 杜四春、銀紅霞定義共用體類型變量的方法與定義結構體類型變量的方法相似,也有三種方法 :1、union 共用體名成員表列;變量表列;例如:union gyint i;char c;float f;a,b,c; C+程序設計湖南大學 杜四春、銀紅霞2、將共用體類型定義與共用體變量定義分開:union gyint i; char c; float f;union gy a,b,c;3、直接定義共用體變量:union int i; char c; float f;a,b,c;上面幾種方法都是定義了一個共用體類型union data,又定義了幾個共用體類型變量a,b,c。C+程序設計湖南大學 杜四春、銀紅霞與結構體類型,也可以定義共用體指針和共用體數(shù)組。union 共用體名 *共用指針名;union 共用體名 數(shù)組名元素個數(shù);例如:union gy *pu;union gy u13;分別定義了共用體指針pu和共用體數(shù)組u13。 C+程序設計湖南大學 杜四春、銀紅

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論