- 后臺開發:核心技術與應用實踐
- 徐曉鑫
- 478字
- 2019-01-03 20:55:32
1.6 結構體、公用體、枚舉
1.6.1 結構體、共用體、枚舉的概念
1.結構體的聲明方法
結構體的聲明方法如下所示:
struct 結構名{ 數據類型 成員名; 數據類型 成員名; ... };
成員表由若干成員組成,每個成員都是該結構的一個組成部分,對每個成員也必須做類型聲明。例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; }
程序的執行結果是:
1 Xiao ming 10 2 Xiao ming 10
例1.11中聲明了一個結構體類型student,定義了兩個student類型的變量stu1和stu2,分別用了兩種定義方法,分別是前面有struct關鍵字和沒有struct關鍵字。這兩種定義方法都是可以的,顯然沒struct關鍵字的使用更為方便。
引用結構體變量中成員的一般方式為:
結構體變量名.成員名
例1.11中,stu1.num表示結構體變量stu1中的成員數量的值。
指針也可以應用于結構體,例1.11中stu3就是一個結構體變量,指向stu1。
2.共用體
共用體,用關鍵字union來定義,它是一種特殊的類。在一個共用體里可以定義多種不同的數據類型,這些數據共享一段內存,在不同的時間里保存不同的數據類型和長度的變量,以達到節省空間的目的。但同一時間只能儲存其中一個成員變量的值。
共用體的聲明方式為:
union 共用體類型名{ 數據類型 成員名; 數據類型 成員名; ... }變量名;
可以使用union判斷系統是big endian(大端)還是little endian(小端)。
【例1.12】 判斷系統是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;
}
程序的執行結果是:
small endian.
其中,big endian是指低地址存放最高有效字節,little endian則是低地址存放最低有效字節。如果將0x1234abcd寫入0x0000開始的內存中,則結果如表1-2所示。
表1-2 big endian和little endian的內存地址增長方向

表1-2展示了0x1234abcd分別在big endian的系統和在little endian的系統上的內存地址是怎么樣分布的。例如0x0000是1Byte的存儲單元,0x12單元一共占了8bit,也就是1byte,即占用了1Byte。
目前,幾乎所有網絡協議都是采用big endian的方式來傳輸數據的,當兩臺采用不同字節序的主機通信時,在發送數據之前都必須經過字節序的轉換成為網絡字節序(big endian)后再進行傳播。
3.枚舉
在實際問題中,有些變量的取值被限定在一個有限的范圍內。例如,一個星期只有7天,一年只有12個月,一個班每周有6門課程等。如果把這些量說明為整型,字符型或其他類型顯然是不妥當的。為此,C語言提供了一種稱為“枚舉”的類型,枚舉類型在C++中也同樣適用。在“枚舉”類型的定義中列舉出所有可能的取值,用來說明該“枚舉”類型的變量取值不能超過定義的范圍。應該說明的是,枚舉類型是一種基本數據類型,而不是一種構造類型,因為它不能再分解為任何其他基本類型。
枚舉的聲明方式為:
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;
只能把枚舉值賦予枚舉變量,不能把元素的數值直接賦予枚舉變量,如下面的語句是正確的:
a=sum; b=mon;
而下面的語句則是錯誤的:
a=0; b=1;
如一定要把數值賦予枚舉變量,則必須用強制類型轉換,如:
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; }
程序的執行結果是:
4
例1.13中定義了3個枚舉類型:weather、fruits和big_cities,其中weather中的枚舉子都被顯式地賦值了,fruits中的枚舉子只賦值了其中幾個,沒顯式賦值的則是前面一個枚舉子的取值+1。同一枚舉類型中的枚舉子的取值不需要是唯一的,可以相同。
- Mastering Concurrency Programming with Java 8
- C程序設計簡明教程(第二版)
- 案例式C語言程序設計
- C語言程序設計習題解析與上機指導(第4版)
- SQL語言從入門到精通
- 精通API架構:設計、運維與演進
- TypeScript項目開發實戰
- Java 9模塊化開發:核心原則與實踐
- Python深度學習:基于TensorFlow
- 詳解MATLAB圖形繪制技術
- C++ Fundamentals
- 深度探索Go語言:對象模型與runtime的原理特性及應用
- JavaScript+jQuery網頁特效設計任務驅動教程
- Python機器學習與量化投資
- SQL Server 2012 數據庫應用教程(第3版)