C語言程序設計實用教程陳方第7章_第1頁
C語言程序設計實用教程陳方第7章_第2頁
C語言程序設計實用教程陳方第7章_第3頁
C語言程序設計實用教程陳方第7章_第4頁
C語言程序設計實用教程陳方第7章_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

7.1結構體結構體和共用體與數組一樣都屬于構造類型。數組的特點是一個數組變量中的所有元素必須是同一種數據類型。顯然,用數組處理大量同類型數據是非常方便的。但是在實際生活中,有許多密切相關的數據需要統一考慮和處理,而它們的數據類型是不同的,如一個學生的檔案信息,包括學號、姓名、性別、年齡、學習成績……,這些數據的類型有整型、字符型、實型等。為了處理由這些不同類型的數據組合成的有機整體,我們引入了一個新的數據類型,稱為結構體。7.1.1結構體類型與結構體類型的變量1.結構體類型的定義結構體類型定義的一般格式為:

struct結構體名{數據類型

成員名1;數據類型

成員名2;……

數據類型

成員名n;};其中,struct是定義結構體類型的關鍵字?!敖Y構體名”是該結構體的名稱,是設計者自己命名的,其命名規(guī)則與標識符的命名規(guī)則相同。由struct和“結構體名”二者組成結構體類型標識符,花括號內列出了該結構體中各成員變量類型及名稱。一個結構體由多個成員變量構成,每個成員變量的類型可以是任何數據類型。注意:不要忽略最后的分號。

2.結構體類型變量的定義

結構體類型定義后,應當定義結構體類型的變量,簡稱結構體變量。結構體變量的定義方式有三種。

(1)先定義結構體類型,再定義結構體變量。定義的一般格式為:

struct結構體名

結構體變量名表列;

(2)在定義結構體類型的同時定義結構體變量。定義的一般格式為:struct結構體名{結構體成員表;}結構體變量名表;(3)直接定義結構體變量。定義的一般格式為:struct{結構體成員表列;}結構體變量名表列;這種定義形式省略了結構體名。

7.1.2結構體變量的引用與初始化1.結構體變量的引用

由于結構體變量中包含若干不同數據類型的成員項,為了引用變量中的某一個成員,必須指明該成員屬于哪一個變量。對結構體變量的引用是通過對其成員的引用來實現的。引用結構體變量中成員的方式為:結構體變量名.成員名“·

”是成員運算符,它在所有的運算符中優(yōu)先級最高。2.結構體變量的初始化

結構體變量的初始化與數組的初始化非常相似,即在定義結構體變量的同時為其成員賦初始值,把各成員的值按順序放在等號右邊的花括號中,各值之間用逗號隔開。[例7-1]

建立一個學生的信息表,對結構體變量初始化。main(){structstudent{longnum;charname[20];charsex;intage;floatscore;};structstudentstu1={102401,"DingYi",‘M’,18,94.5};printf("No.=%ld,Name=%s,sex=%c,age=%d,score=%.2f\n",stu1.num,,stu1.sex,stu1.age,stu1.score);}7.1.3數組數組的元素也可以是結構體類型的,這樣就構成了結構體數組。結構體數組的每一個元素都是具有相同結構體類型的結構體變量。在實際應用中,經常用結構體數組來表示具有相同數據結構的一個群體。如一個班的學生檔案,一個單位的職工的工資表等。1.結構體數組的定義

結構體數組的定義方法與結構體變量的定義方法相似。例如:structstudent{longnum;charname[20];charsex;intage;floatscore;}stu[40];定義了一個結構體數組stu,它包含40個元素stu[0]~stu[39],每個數組元素都是structstudent類型的結構體形式。

2.結構體數組的初始化結構體數組的初始化與數組的初始化一樣。3.結構體數組元素的引用

結構體數組的每個元素相當于一個結構體變量,因此引用結構體數組元素的成員與引用結構體類型變量的成員的方式相似。引用一個結構體數組元素的成員變量的格式為:

結構體數組名[下標].成員名[例7-2]

使用結構體數組計算學生的平均成績。structstudent{intnum;charname[10];floatscore;}stu[5]={{101,"WangPing",80.5},{102,"HuangHao",90},{103,"XuePing",70.5},{104,"ZhaoMei",75},{105,"JiaMing",62.5}};main(){inti;floatave,sum=0;for(i=0;i<5;i++)sum+=stu[i].score;ave=sum/5;printf("average=%f\n",ave);}7.1.4結構體指針

1.結構體指針變量(1)結構體指針變量的定義struct結構體名*結構體指針變量名;例如:structstudentstu1,*ptr;這里定義了一個structstudent類型的指針變量ptr以及一個結構體變量stu1,其中structstudent為已經定義過的結構體類型。(2)結構體指針變量的初始化結構體指針變量的初始化就是把結構體變量的首地址賦給它,(3)結構體指針變量的使用利用結構體指針變量可以方便地引用結構體變量成員。其引用的一般形式為:

(*結構體指針變量名).成員名或:

結構體指針變量→成員名

2.結構體數組指針

一個結構體指針變量不僅可以指向結構體變量,也可以指向結構體數組,這種指向結構體數組的指針就是結構體數組指針。

(1)結構體數組指針的定義結構體數組指針的定義方法與結構體變量指針的定義方法類似,只要把結構體數組的首地址賦給該指針變量即可。

(2)結構體數組指針的使用

設ptr為指向結構體數組的指針變量,則ptr指向該結構體數組的第0號元素,ptr+1指向第1號元素,ptr+i則指向第i號元素。這與普通數組的情況是一致的。7.1.5結構體與函數在實際編程中,可以用結構體變量和結構體指針變量作為函數參數,以實現函數之間的數據傳遞。常用的有以下三種方法:(1)結構體變量的成員作函數參數

結構體變量的成員可作為函數參數,用法和用普通變量作實參是一樣的,屬于“值傳遞”方式。應當注意,實參與形參的類型應保持一致。(2)結構體變量作函數參數

用結構體變量作函數參數,取的是“值傳遞”的方式,將結構體變量所占的內存單元的內容全部順序傳遞給形參。形參也必須是同類型的結構體變量。在函數調用期間形參也要占用內存單元。這種傳遞方式在空間和時間上開銷較大,嚴重地降低了程序的效率,因此這種方法較少使用。(3)用結構體指針變量作函數參數

用結構體指針變量作函數參數進行傳送,這時由實參傳向形參的只是地址,從而減少了時間和空間的開銷,使程序效率提高。7.2共用體

共用體(或稱聯合),也屬于構造類型。共用體類型的定義和共用體類型變量的定義方式與結構體定義方式相似。但它們的含義不同,結構體變量中的成員占據獨立的內存空間,而共用體變量中的所有成員共用同一段內存空間,在同一時刻,共用體只有一個成員變量是可用的,結構體變量所占內存長度是各成員占的內存長度之和,而共用體變量所占的內存長度等于最長的成員的長度。1.共用體類型的定義

共用體類型定義的一般格式為:union共用體名{數據類型

共用體成員名1;數據類型

共用體成員名2;…

…數據類型

共用體成員名n;};

其中,union是關鍵字,是共用體類型的標志。共用體名的按標識符的命名規(guī)則命名。

2.共用體變量的定義

定義共用體變量與定義結構體變量相似,也有3種方式。(1)定義共用體類型的同時定義共用體變量。例如:uniondata{inti;charj;floatk;}m;其中,m為共用體類型變量,它的成員共用同一個內存單元中,且該內存單元的長度等于最長的成員的長度4字節(jié)(因為一個float型變量占4個字節(jié))。(2)先定義共用體類型再定義共用體變量。(3)直接定義共用體變量。3.共用體變量的引用方式

只有先定義了共用體變量才能引用它。而且不能單獨引用共用體變量,只能引用共用體變量中的成員。引用共用體變量的格式為:共用體變量名.成員名4.共用體類型數據的特點

在使用共用體類型數據時要注意以下一些特點:(1)同一個內存段可以用來存放不同類型的成員,但在每一瞬時只能存放其中的一種,也就是說每一瞬時只有一個成員起作用,其他的成員不起作用。(2)共用體變量中起作用的成員是最后一次存放的成員,在存入一個新成員后原有的成員就失去作用。

(3)共用體變量的地址和它的各成員的地址都是同一地址。(4)不能單獨引用共用體變量名,而必須帶有成員名,即采用“共用體變量名.成員名”的形式。(5)不能在定義共用體變量時對它初始化。

(6)共用體變量不能作為函數參數,也不能使函數帶回共用體變量,但可以使用指向共用體變量的指針。(7)共用體成員可以有結構體類型,反之,結構體成員也可以有共用體類型,數組也可以作為共用體的成員。(8)可以定義共用體數組。7.3枚舉如果一個變量只有幾種可能的值,可以定義為枚舉類型。所謂“枚舉”是指將變量的值一一列舉出來,變量的值只限于列舉出來的值的范圍內。例如:表示月份的數據只能是1到12之間的整數,表示顏色的數據取值只能是紅、黃、藍等顏色。1.枚舉類型的定義

枚舉類型定義的一般格式為:enum枚舉類型名{枚舉值列表};例如:enummonth{Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};enumweek{Sum,Mon,Tue,Wed,Thu,Fri,Sat};

其中,enum是關鍵字,說明這是枚舉類型。枚舉類型名按標識符的命名規(guī)則命名。

花括號內的內容是枚舉類型的取值,必須列出所有可能的取值?;ɡㄌ栔械拿质怯脩糁付ǖ模喈斢谝粋€常量,可以在程序代碼中直接使用。系統自動為每個枚舉值分配一個編號,從0開始以1為單位遞增。即上例中Sum的編號為0,Mon的編號為1,如此類推。C語言不允許直接使用數值作為枚舉值,如下面的定義是不合法的:enumweek{0,1,2,3,4,5,6};但可以在類型定義時對枚舉值顯式分配編號,如有定義:enumcolor{red=2,yellow,green,black,blue=9};則枚舉值red的編號為2,yellow的編號為3,green的編號為4,black為5,而blue的編號為9。沒有顯示寫出編號的枚舉值的編號以前一個的編號為準以1為單位遞增。2.枚舉類型變量的定義

枚舉類型變量定義的一般格式有3種:①

enum枚舉類型名{枚舉值列表}枚舉變量表;②

enum枚舉類型名

枚舉變量表;③

enum{枚舉值列表}枚舉變量表;上述第3種枚舉類型變量的定義方式必須在它之前先定義好枚舉類型。3.枚舉類型變量的使用規(guī)則

(1)枚舉變量的取值只能是指定的若干個枚舉值之一。例如:enumweek{Sum,Mon,Tue,Wed,Thu,Fri,Sat}wk;

wk=Fri;(2)不允許直接將一個整型數賦值給一個枚舉變量,因為它們屬于不同的類型。

(3)枚舉值可以進行比較。比較的規(guī)則是按其在定義時的編號比較。如果定義時未指定,則按系統缺省的順序編號比較,即第一個枚舉值為0。

例如:enumweek{Sum,Mon,Tue,Wed,Thu,Fri,Sat}wk1,wk2;wk1=Mon;wk2=Tue;if(wk1<wk2)printf("wk1isearlierthanwk2");7.4用typedef定義類型名

在第2章第3節(jié)中,已介紹了可以用typedef定義新的類型名,取代C語言提供的標準類型名(如int、char、float、double、long等),同樣,用它定義新的類型名也可以代替結構體、共用體、指針、枚舉類型名。其定義格式為:typedef已有類型名

新類型名;

例如:typedefintINTEGER;

溫馨提示

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

評論

0/150

提交評論