c语言结构体使用方法
?
結構(struct)
???? 結構是由基本數據類型構成的、并用一個標識符來命名的各種變量的組合。?
結構中能夠使用不同的數據類型。?
??? 1. 結構說明和結構變量定義?
??? 在Turbo C中, 結構也是一種數據類型, 能夠使用結構變量, 因此,? 象其他?
類型的變量一樣, 在使用結構變量時要先對其定義。?
??? 定義結構變量的一般格式為:?
???? struct 結構名?
???? {?
????????? 類型? 變量名;?
????????? 類型? 變量名;?
????????? ...?
???? } 結構變量;?
??? 結構名是結構的標識符不是變量名。?
??? 類型為第二節中所講述的五種數據類型(整型、浮點型、字符型、指針型和?
無值型)。?
??? 構成結構的每個類型變量稱為結構成員, 它象數組的元素一樣, 但數組中?
元素是下面標來訪問的, 而結構是按變量名字來訪問成員的。?
??? 以下舉一個樣例來說明如何定義結構變量。?
???? struct string?
???? {?
????????? char name[8];?
????????? int age;?
????????? char sex[2];?
????????? char depart[20];?
????????? float wage1, wage2, wage3, wage4, wage5;?
???? } person;?
??? 這個樣例定義了一個結構名為string的結構變量person,?? 假設省略變量名?
person, 則變成對結構的說明。用已說明的結構名也可定義結構變量。這樣定義?
時上例變成:?
???? struct string?
???? {?
????????? char name[8];?
????????? int age;?
????????? char sex[2];?
????????? char depart[20];?
????????? float wage1, wage2, wage3, wage4, wage5;?
???? };?
???? struct string person;?
??? 假設須要定義多個具有同樣形式的結構變量時用這樣的方法比較方便, 它先作?
結構說明, 再用結構名來定義變量。?
??? 比如:?
???? struct string Tianyr, Liuqi, ...;?
??? 假設省略結構名, 則稱之為無名結構, 這樣的情況經常出如今函數內部, 用這?
種結構時前面的樣例變成:?
???? struct?
???? {?
????????? char name[8];?
????????? int age;?
????????? char sex[2];?
????????? char depart[20];?
????????? float wage1, wage2, wage3, wage4, wage5;?
???? } Tianyr, Liuqi;?
??? 2. 結構變量的使用?
??? 結構是一個新的數據類型, 因此結構變量也能夠象其他類型的變量一樣賦值、?
運算, 不同的是結構變量以成員作為基本變量。?
??? 結構成員的表示方式為:?
????????? 結構變量.成員名?
??? 假設將"結構變量.成員名"看成一個總體,? 則這個總體的數據類型與結構中?
該成員的數據類型同樣, 這樣就可象前面所講的變量那樣使用。?
??? 以下這個樣例定義了一個結構變量, 當中每一個成員都從鍵盤接收數據, 然后?
對結構中的浮點數求和, 并顯示運算結果, 同一時候將數據以文本方式存入一個名為?
wage.dat的磁盤文件里。請注意這個樣例中不同結構成員的訪問。?
??? 例3:?
???? #i nclude <stdio.h>?
???? main()?
???? {?
????????? struct{????????????????? /*定義一個結構變量*/?
?????????????? char name[8];?
?????????????? int age;?
?????????????? char sex[2];?
?????????????? char depart[20];?
?????????????? float wage1, wage2, wage3, wage4,?
wage5;?
????????? }a;?
????????? FILE *fp;?
????????? float wage;?
????????? char c=’Y’;?
????????? fp="fopen"("wage.dat", "w");????
/*創建一個文件僅僅寫*/?
????????? while(c==’Y’||c==’y’)?????????
/*推斷是否繼續循環*/?
????????? {?
?????????????? printf("/nName:");?
?????????????? scanf("%s", a.name);???? /*輸入姓名*/?
?????????????? printf("Age:");?
?????????????? scanf("%d", &a.wage);??? /*輸入年齡*/?
?????????????? printf("Sex:");?
?????????????? scanf("%d", a.sex);?
?????????????? printf("Dept:");?
?????????????? scanf("%s", a.depart);?
?????????????? printf("Wage1:");?
?????????????? scanf("%f", &a.wage1);?? /*輸入工資*/?
?????????????? printf("Wage2:");?
?????????????? scanf("%f", &a.wage2);?
?????????????? printf("Wage3:");?
?????????????? scanf("%f", &a.wage3);?
?????????????? printf("Wage4:");?
?????????????? scanf("%f", &a.wage4);?
?????????????? printf("Wage5:");?
?????????????? scanf("%f", &a.wage5);?
???????????????
wage=a.wage1+a.wage2+a.wage3+a.wage4+a.wage5;?
?????????????? printf("The sum of wage is?
%6.2f/n", wage);/*顯示結果*/?
?????????????? fprintf(fp,?
"%10s%4d%4s%30s%10.2f/n",? /*結果寫入文件*/?
??????????????????????????? a.name, a.age, a.sex,?
a.depart, wage);?
?????????????? while(1)?
?????????????? {?
??????????????????? printf("Continue?<Y/N>");?
??????????????????? c="getche"();?
????????????????????
if(c==’Y’||c==’y’||c==’N’||c==’n’)?
???????????????????????? break;?
?????????????? }?
????????? }?
????????? fclose(fp);?
???? }?
??? 3. 結構數組和結構指針?
??? 結構是一種新的數據類型, 相同能夠有結構數組和結構指針。?
??? 一、結構數組?
??? 結構數組就是具有同樣結構類型的變量集合。假如要定義一個班級40個同學?
的姓名、性別、年齡和住址, 能夠定義成一個結構數組。例如以下所看到的:?
???? struct{?
????????? char name[8];?
????????? char sex[2];?
????????? int age;?
????????? char addr[40];?
???? }student[40];?
??? 也可定義為:?
???? struct string{?
????????? char name[8];?
????????? char sex[2];?
????????? int age;?
????????? char addr[40];?
???? };?
???? struct string student[40];?
??? 須要指出的是結構數組成員的訪問是以數組元素為結構變量的, 其形式為:?
????????? 結構數組元素.成員名?
??? 比如:?
????? student[0].name?
????? student[30].age?
??? 實際上結構數組相當于一個二維構造, 第一維是結構數組元素, 每一個元素是?
一個結構變量, 第二維是結構成員。?
??? 注意:?
??? 結構數組的成員也能夠是數組變量。?
??? 比如:?
???? struct a?
???? {?
????????? int m[3][5];?
????????? float f;?
????????? char s[20];?
???? }y[4];?
??? 為了訪問結構a中結構變量y[2]的這個變量, 可寫成?
?????? y[2].m[1][4]?
??? 二、結構指針?
??? 結構指針是指向結構的指針。它由一個加在結構變量名前的"*" 操作符來定?
義, 比如用前面已說明的結構定義一個結構指針例如以下:?
???? struct string{?
????????? char name[8];?
????????? char sex[2];?
????????? int age;?
????????? char addr[40];?
???? }*student;?
??? 也可省略結構指針名僅僅作結構說明, 然后再用以下的語句定義結構指針。?
????? struct string *student;?
??? 使用結構指針對結構成員的訪問, 與結構變量對結構成員的訪問在表達方式?
上有所不同。結構指針對結構成員的訪問表示為:?
?????? 結構指針名->結構成員?
??? 當中"->"是兩個符號"-"和">"的組合, 好象一個箭頭指向結構成員。比如要?
給上面定義的結構中name和age賦值, 能夠用以下語句:?
???? strcpy(student->name, "Lu G.C");?
???? student->age=18;?
??? 實際上, student->name就是(*student).name的縮寫形式。?
??? 須要指出的是結構指針是指向結構的一個指針, 即結構中第一個成員的首地?
址, 因此在使用之前應該對結構指針初始化, 即分配整個結構長度的字節空間,?
這可用以下函數完畢, 仍以上例來說明例如以下:?
???? student=(struct string*)malloc(size of?
(struct string));?
??? size of (struct string)自己主動求取string結構的字節長度,?
malloc() 函數?
定義了一個大小為結構長度的內存區域, 然后將其詐地址作為結構指針返回。?
??? 注意:?
??? 1. 結構作為一種數據類型,? 因此定義的結構變量或結構指針變量相同有局?
部變量和全程變量, 視定義的位置而定。?
??? 2. 結構變量名不是指向該結構的地址, 這與數組名的含義不同,? 因此若需?
要求結構中第一個成員的首地址應該是&[結構變量名]。?
??? 4. 結構的復雜形式?
??? 一、嵌套結構?
??? 嵌套結構是指在一個結構成員中能夠包含其他一個結構, Turbo C 同意這樣的?
嵌套。?
??? 比如: 以下是一個有嵌套的結構?
???? struct string{?
????????? char name[8];?
????????? int age;?
????????? struct addr address;?
???? } student;?
??? 當中: addr為還有一個結構的結構名, 必需要先進行, 說明, 即?
???? struct addr{?
????????? char city[20];?
????????? unsigned lon zipcode;?
????????? char tel[14];?
???? }?
??? 假設要給student結構中成員address結構中的zipcode賦值, 則可寫成:?
????? student.address.zipcode=200001;?
??? 每一個結構成員名從最外層直到最內層逐個被列出, 即嵌套式結構成員的表達?
方式是:?
????? 結構變量名.嵌套結構變量名.結構成員名?
??? 當中: 嵌套結構能夠有非常多, 結構成員名為最內層結構中不是結構的成員名。?
??
??? 二、位結構?
??? 位結構是一種特殊的結構, 在需按位訪問一個字節或字的多個位時, 位結構?
比按位運算符更加方便。?
??? 位結構定義的一般形式為:?
???? struct位結構名{?
????????? 數據類型 變量名: 整型常數;?
????????? 數據類型 變量名: 整型常數;?
???? } 位結構變量;?
??? 當中: 數據類型必須是int(unsigned或signed)。 整型常數必須是非負的整?
數, 范圍是0~15, 表示二進制位的個數, 即表示有多少位。?
??? 變量名是選擇項, 能夠不命名, 這樣規定是為了排列須要。?
??? 比如: 以下定義了一個位結構。?
???? struct{?
????????? unsigned incon: 8;??
/*incon占用低字節的0~7共8位*/?
????????? unsigned txcolor:?
4;/*txcolor占用高字節的0~3位共4位*/?
????????? unsigned bgcolor:?
3;/*bgcolor占用高字節的4~6位共3位*/?
????????? unsigned blink: 1;? /*blink占用高字節的第7位*/?
???? }ch;?
??? 位結構成員的訪問與結構成員的訪問同樣。?
??? 比如: 訪問上例位結構中的bgcolor成員可寫成:?
????? ch.bgcolor?
??
??? 注意:?
??? 1. 位結構中的成員能夠定義為unsigned, 也可定義為signed,? 但當成員長?
度為1時, 會被覺得是unsigned類型。由于單個位不可能具有符號。?
??? 2. 位結構中的成員不能使用數組和指針, 但位結構變量能夠是數組和指針,?
假設是指針, 其成員訪問方式同結構指針。?
??? 3. 位結構總長度(位數), 是各個位成員定義的位數之和,? 能夠超過兩個字?
節。?
??? 4. 位結構成員能夠與其他結構成員一起使用。?
??? 比如:?
???? struct info{?
????????? char name[8];?
????????? int age;?
????????? struct addr address;?
????????? float pay;?
????????? unsigned state: 1;?
????????? unsigned pay: 1;?
????????? }workers;’?
??? 上例的結構定義了關于一個工從的信息。當中有兩個位結構成員, 每一個位結?
構成員僅僅有一位, 因此僅僅占一個字節但保存了兩個信息, 該字節中第一位表示工?
人的狀態, 第二位表示工資是否已發放。由此可見使用位結構能夠節省存貯空間。?
總結
以上是生活随笔為你收集整理的c语言结构体使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用CocoStudio场景编辑器制
- 下一篇: Hyper-V的实验安装----1