- 后臺開發(fā):核心技術與應用實踐
- 徐曉鑫
- 11字
- 2019-01-03 20:55:32
1.6 結構體、公用體、枚舉
1.6.1 結構體、共用體、枚舉的概念
1.結構體的聲明方法
結構體的聲明方法如下所示:
struct 結構名{ 數(shù)據(jù)類型 成員名; 數(shù)據(jù)類型 成員名; ... };
成員表由若干成員組成,每個成員都是該結構的一個組成部分,對每個成員也必須做類型聲明。例1.11說明了結構體的使用方法。
【例1.11】 結構體使用范例。
#include<iostream> #include<string.h> using namespace std; struct student{ // 聲明一個結構體類型student int num; char name[20]; int age; }; // 最后有一個分號 int main(){ struct student stu1; // 定義一個student類型的變量stu1 student stu2; // 定義時也可以不用struct stu1.num=1; // 單獨對st1的num元素賦值 char temp[20]="Xiao ming"; strncpy(stu1.name,temp,strlen(temp)); stu1.age=10; cout<<stu1.num<<" "<<stu1.name<<" "<<stu1.age<<endl; student *stu3=&stu1; // stu3是結構體的指針,指向stu1 (*stu3).num=2; // stu1的num值被修改成了2; cout<<stu1.num<<" "<<stu1.name<<" "<<stu1.age<<endl; return 0; }
程序的執(zhí)行結果是:
1 Xiao ming 10 2 Xiao ming 10
例1.11中聲明了一個結構體類型student,定義了兩個student類型的變量stu1和stu2,分別用了兩種定義方法,分別是前面有struct關鍵字和沒有struct關鍵字。這兩種定義方法都是可以的,顯然沒struct關鍵字的使用更為方便。
引用結構體變量中成員的一般方式為:
結構體變量名.成員名
例1.11中,stu1.num表示結構體變量stu1中的成員數(shù)量的值。
指針也可以應用于結構體,例1.11中stu3就是一個結構體變量,指向stu1。
2.共用體
共用體,用關鍵字union來定義,它是一種特殊的類。在一個共用體里可以定義多種不同的數(shù)據(jù)類型,這些數(shù)據(jù)共享一段內(nèi)存,在不同的時間里保存不同的數(shù)據(jù)類型和長度的變量,以達到節(jié)省空間的目的。但同一時間只能儲存其中一個成員變量的值。
共用體的聲明方式為:
union 共用體類型名{ 數(shù)據(jù)類型 成員名; 數(shù)據(jù)類型 成員名; ... }變量名;
可以使用union判斷系統(tǒng)是big endian(大端)還是little endian(小端)。
【例1.12】 判斷系統(tǒng)是big endian還是little endian。
#include<iostream>
using namespace std;
union TEST{
short a;
char b[sizeof(short)];
};
int main(){
TEST test;
test.a=0x0102;// 不能引用共用體變量,只能引用共用體變量中的成員。
if(test.b[0]==0x01&&test.b[1]==0x02){
cout<<"big endian."<<endl;
}
else if(test.b[0]==0x02&&test.b[1]==0x01){
cout<<"small endian."<<endl;
}
else{
cout<<"unknown"<<endl;
}
return 0;
}
程序的執(zhí)行結果是:
small endian.
其中,big endian是指低地址存放最高有效字節(jié),little endian則是低地址存放最低有效字節(jié)。如果將0x1234abcd寫入0x0000開始的內(nèi)存中,則結果如表1-2所示。
表1-2 big endian和little endian的內(nèi)存地址增長方向

表1-2展示了0x1234abcd分別在big endian的系統(tǒng)和在little endian的系統(tǒng)上的內(nèi)存地址是怎么樣分布的。例如0x0000是1Byte的存儲單元,0x12單元一共占了8bit,也就是1byte,即占用了1Byte。
目前,幾乎所有網(wǎng)絡協(xié)議都是采用big endian的方式來傳輸數(shù)據(jù)的,當兩臺采用不同字節(jié)序的主機通信時,在發(fā)送數(shù)據(jù)之前都必須經(jīng)過字節(jié)序的轉換成為網(wǎng)絡字節(jié)序(big endian)后再進行傳播。
3.枚舉
在實際問題中,有些變量的取值被限定在一個有限的范圍內(nèi)。例如,一個星期只有7天,一年只有12個月,一個班每周有6門課程等。如果把這些量說明為整型,字符型或其他類型顯然是不妥當?shù)摹榇耍珻語言提供了一種稱為“枚舉”的類型,枚舉類型在C++中也同樣適用。在“枚舉”類型的定義中列舉出所有可能的取值,用來說明該“枚舉”類型的變量取值不能超過定義的范圍。應該說明的是,枚舉類型是一種基本數(shù)據(jù)類型,而不是一種構造類型,因為它不能再分解為任何其他基本類型。
枚舉的聲明方式為:
enum 枚舉類型名{枚舉常量表列};
如同結構和共用體一樣,枚舉變量也可用不同的方式說明,即先定義后說明,同時定義說明或直接說明。
設有變量a,b,c是枚舉類型weekday,可采用下述任一種方式:
enum weekday{ sun,mou,tue,wed,thu,fri,sat }; enum weekday a,b,c;
或者為:
enum weekday{ sun,mou,tue,wed,thu,fri,sat }a,b,c;
或者為:
enum { sun,mou,tue,wed,thu,fri,sat }a,b,c;
枚舉值是常量,不是變量。不能在程序中用賦值語句再對它賦值。
例如對枚舉weekday的元素再作以下賦值,都是錯誤的:
sun=5; mon=2; sun=mon;
只能把枚舉值賦予枚舉變量,不能把元素的數(shù)值直接賦予枚舉變量,如下面的語句是正確的:
a=sum; b=mon;
而下面的語句則是錯誤的:
a=0; b=1;
如一定要把數(shù)值賦予枚舉變量,則必須用強制類型轉換,如:
a=(enum weekday)2;
其意義是將順序號為2的枚舉元素賦予枚舉變量a,相當于:
a=tue;
還應該說明的是枚舉元素不是字符常量也不是字符串常量,使用時不要加單、雙引號。
【例1.13】 enum使用范例。
#include<iostream> using namespace std; int main(){ enum weather{sunny,cloudy,rainy,windy}; /*其中sunny=0,cloudy=1,rainy=2,windy=3, 默認地,第一個枚舉子被賦值為0*/ enum fruits{apple=3,orange,banana=7,bear}; /*也可以顯式地賦值,接下來的枚舉子取值是前面一個枚舉子的取值+1,即orange=4,bear=8*/ cout<<orange<<endl; enum big_cities{guangzhou=1,shenzhen=3, eijing=1,shanghai=2}; /*同一枚舉中的枚舉子的取值不需要是唯一的*/ return 0; }
程序的執(zhí)行結果是:
4
例1.13中定義了3個枚舉類型:weather、fruits和big_cities,其中weather中的枚舉子都被顯式地賦值了,fruits中的枚舉子只賦值了其中幾個,沒顯式賦值的則是前面一個枚舉子的取值+1。同一枚舉類型中的枚舉子的取值不需要是唯一的,可以相同。
- Qt 5 and OpenCV 4 Computer Vision Projects
- Learning Java Functional Programming
- 潮流:UI設計必修課
- Visual FoxPro程序設計教程(第3版)
- NLTK基礎教程:用NLTK和Python庫構建機器學習應用
- 深入理解Java7:核心技術與最佳實踐
- C/C++常用算法手冊(第3版)
- Building a Recommendation Engine with Scala
- Windows Server 2012 Unified Remote Access Planning and Deployment
- Visual Basic程序設計實驗指導(第4版)
- 利用Python進行數(shù)據(jù)分析
- C/C++數(shù)據(jù)結構與算法速學速用大辭典
- iOS開發(fā)項目化入門教程
- C語言程序設計
- Laravel Design Patterns and Best Practices