?? 10.學c51的基礎 10《 聯 合(union) 》.txt
字號:
=================================================
詳細內容十:學C51的基礎---- 聯合體,結構體(struct)
=================================================
............................................聯合(union)........................................................
1. 聯合說明和聯合變量定義
聯合也是一種新的數據類型, 它是一種特殊形式的變量。
聯合說明和聯合變量定義與結構十分相似。其形式為:
union 聯合名{
數據類型 成員名;
數據類型 成員名;
...
} 聯合變量名;
聯合表示幾個變量公用一個內存位置, 在不同的時間保存不同的數據類型和不同長度的變量。
下例表示說明一個聯合a_bc:
union a_bc{
int i;
char mm;
};
再用已說明的聯合可定義聯合變量。例如用上面說明的聯合定義一個名為lgc的聯合變量, 可寫成:
union a_bc lgc;
在聯合變量lgc中, 整型量i和字符mm公用同一內存位置。
當一個聯合被說明時, 編譯程序自動地產生一個變量, 其長度為聯合中最大的變量長度。
聯合訪問其成員的方法與結構相同。同樣聯合變量也可以定義成數組或指針,但定義為指針時, 也要用"->"符號, 此時聯合訪問
成員可表示成:
聯合名->成員名
另外, 聯合既可以出現在結構內, 它的成員也可以是結構。
例如:
struct{
int age;
char *addr;
union{
int i;
char *ch;
}x;
}y[10];
若要訪問結構變量y[1]中聯合x的成員i, 可以寫成:
y[1].x.i;
若要訪問結構變量y[2]中聯合x的字符串指針ch的第一個字符可寫成:
*y[2].x.ch;
若寫成"y[2].x.*ch;"是錯誤的。
2. 結構和聯合的區別
結構和聯合有下列區別:
1. 結構和聯合都是由多個不同的數據類型成員組成, 但在任何同一時刻, 聯合中只存放了一個被選中的成員, 而結構的所有成
員都存在。
2. 對于聯合的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對于結構的不同成員賦值是互不影響的。
下面舉一個例了來加對深聯合的理解。
例4:
main()
{
union{ /*定義一個聯合*/
int i;
struct{ /*在聯合中定義一個結構*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*聯合成員賦值*/
printf("%c%c\n", number.half.first, mumber.half.second);
number.half.first=''a''; /*聯合中結構成員賦值*/
number.half.second=''b'';
printf("%x\n", number.i);
getch();
}
輸出結果為:
AB
6261
從上例結果可以看出: 當給i賦值后, 其低八位也就是first和second的值; 當給first和second賦字符后, 這兩個字符的ASCII
碼也將作為i 的低八位和高八位。
............................................結構(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:
#include < 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?");
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;''
上例的結構定義了關于一個工從的信息。其中有兩個位結構成員, 每個位結構成員只有一位, 因此只占一個字節但保存了兩個
信息, 該字節中第一位表示工人的狀態, 第二位表示工資是否已發放。由此可見使用位結構可以節省存貯空間。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -