網(wǎng)站首頁 編程語言 正文
一、什么是結(jié)構(gòu)體
結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個成員可以是不同類型的變量。
//結(jié)構(gòu)體聲明 struct tag //struct:結(jié)構(gòu)體關(guān)鍵字,tag:標(biāo)簽名,合起來是結(jié)構(gòu)體類型(類型名) { member - list;//大括號里面的是結(jié)構(gòu)體成員變量 }variable - list;//結(jié)構(gòu)體變量
1.結(jié)構(gòu)體實現(xiàn)
代碼如下:
#includestruct Book { char name[20];//書名 int price;//價格 char id[20];//書號 }b2,b3,b4;//結(jié)構(gòu)體變量(全局變量) int main() { //結(jié)構(gòu)體變量(局部變量) struct Book b1 = { "c和指針", 30, "1112345454" };//結(jié)構(gòu)體初始化 struct Book* pb = &b1; printf("%s %d %s\n",b1.name,b1.price,b1.id ); printf("%s %d %s\n", pb->name, pb->price, pb->id);//指針方式打印 return 0; }
2.匿名結(jié)構(gòu)體類型
//匿名結(jié)構(gòu)體類型 struct { int a; char b; float c; }s;//直接永匿名結(jié)構(gòu)體類型創(chuàng)建了一個變量s,匿名結(jié)構(gòu)體只能用一次 struct { int a; char b; float c; }*ps;//匿名結(jié)構(gòu)體的指針 結(jié)構(gòu)在聲明的時候省略掉了結(jié)構(gòu)體標(biāo)簽(tag)就叫做匿名結(jié)構(gòu)體。 那么問題來了? int main() { ps = &s;//不合法,編譯器會把上面的兩個聲明當(dāng)成完全不同的兩個類型。 所以是非法的 }
3.結(jié)構(gòu)體自引用
struct Node { int data; struct Node* next; } //結(jié)構(gòu)體自引用 //這個節(jié)點能夠找到同類型的下一個節(jié)點,這就叫結(jié)構(gòu)體的自引用,我自己能找到同類型跟自己同類型的下一個元素就叫結(jié)構(gòu)體的自引用。 //結(jié)構(gòu)體的自引用實現(xiàn):在結(jié)構(gòu)體里面包含同類型的結(jié)構(gòu)體的指針。
4.結(jié)構(gòu)體的內(nèi)存對齊
首先得掌握結(jié)構(gòu)體的對齊規(guī)則:
1. 第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
2. 其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。 對齊數(shù) = 編譯器默認的一個對齊數(shù) 與 該成員大小的較小值。 VS中默認的值為8
3. 結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍。
4. 如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整 體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
我們來算一下上面結(jié)構(gòu)體S內(nèi)存大小為什么是12個字節(jié)
我用到編譯器是vs,vs編譯器的默認對齊數(shù)是8.
1.結(jié)構(gòu)體的第一個成員,放在結(jié)構(gòu)體變量在內(nèi)存中儲存位置的0偏移處開始。
2.從第二個成員往后的所有成員,都放在一個對齊數(shù)(成員的大小和默認對齊數(shù)的較小值)的整數(shù)的整數(shù)倍的地址處。
3.結(jié)構(gòu)體的總大小是結(jié)構(gòu)體的所有成員的對齊數(shù)中最大的那個對齊數(shù)的整數(shù)倍。
5.結(jié)構(gòu)體位段
位段的聲明和結(jié)構(gòu)是類似的,有兩個不同:
1.位段的成員必須是 int、unsigned int 或signed int 。
2.位段的成員名后邊有一個冒號和一個數(shù)字。
假設(shè)我們用二進制的方式來表示性別,分為男、女、保密。可以用00、01、10分別表示。這樣我們連一個字節(jié)的大小都用不到,但如果我們創(chuàng)建變量,一個int變量就占四個字節(jié),所以說位段在一定程度上節(jié)省了空間。
位段的內(nèi)存分配
1. 位段的成員可以是 int unsigned int signed int 或者是 char (屬于整形家族)類型
2. 位段的空間上是按照需要以4個字節(jié)( int )或者1個字節(jié)( char )的方式來開辟的。
3. 位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應(yīng)該避免使用位段。
?二、什么是枚舉
性別有:男、女、保密,也可以一一列舉。
月份有12個月,也可以一一列舉
這里就可以使用枚舉了。
枚舉是要創(chuàng)造出一種新的類型,這種類型的取值是非常有限的,明確的只有那么幾種可能取值,我們就可以用枚舉來創(chuàng)造一個枚舉類型
枚舉類型的大小就是4.
1.枚舉類型的定義
#include//聲明枚舉類型 enum Color//enum枚舉關(guān)鍵字,Color枚舉類型, { RED,//大括號里面放的是枚舉的可能取值(常量) GREEN, BLUE }; int main() { enum Color c = BLUE; return 0; }
大括號里面這些可能取值都是有值的,默認從0開始,一次遞增1,當(dāng)然在定義的時候也可以賦初值。
enum Color//顏色 { RED=1, GREEN=2, BLUE=4 };
2.枚舉的優(yōu)點
我們可以使用 #define 定義常量,為什么非要使用枚舉?
枚舉的優(yōu)點:
1. 增加代碼的可讀性和可維護性
2. 和#define定義的標(biāo)識符比較枚舉有類型檢查,更加嚴謹。
3. 防止了命名污染(封裝)
4. 便于調(diào)試
5. 使用方便,一次可以定義多個常量
三、聯(lián)合(共用體)
1.什么是聯(lián)合(共用體)
聯(lián)合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間(所以聯(lián)合也叫共用體)。
2.聯(lián)合(共用體)的定義
//聯(lián)合類型的聲明 union Un { char c; int i; }; //聯(lián)合變量的定義 union Un un; //計算連個變量的大小 printf("%d\n", sizeof(un));
計算聯(lián)合(共用體)的大小
?這里為什么算出的結(jié)果是4呢,我們看下圖:
聯(lián)合的成員是共用同一塊內(nèi)存空間的,這樣一個聯(lián)合變量的大小,至少是最大成員的大小(因為聯(lián) 合至少得有能力保存最大的那個成員)。
3.聯(lián)合(共用體)的初始化
#includeunion Un { char c; int i; }; int main() { union Un u = { 10 };//初始化 u.i = 1000;//成員變量單獨初始化 u.c = 100; printf("%p\n",&u ); printf("%p\n", &(u.c)); printf("%p\n", &(u.i)); return 0; }
總結(jié)
這樣就簡單介紹完了結(jié)構(gòu)體,枚舉和聯(lián)合體的定義,初始化,和簡單的使用。寫的比較潦草,如果上述文章有任何問題?,歡迎大佬們提出質(zhì)疑,我會虛心學(xué)習(xí)和改正,最重要的是能共同進步,共同成長,學(xué)習(xí)好編程。
原文鏈接:https://blog.csdn.net/m0_64397675/article/details/122877148
相關(guān)推薦
- 2022-05-23 Android實現(xiàn)手機聯(lián)系人分欄效果_Android
- 2022-06-19 詳解.Net中字符串不變性與相等判斷的特殊場景_實用技巧
- 2022-10-18 一文詳解Python中的Map,Filter和Reduce函數(shù)_python
- 2023-07-08 keycloak更新token調(diào)用updateToken函數(shù)無效,解決辦法
- 2022-04-19 jQuery下實現(xiàn)等待指定元素加載完畢
- 2022-10-19 Android?webview加載H5方法詳細介紹_Android
- 2022-02-23 關(guān)于zabbix自定義監(jiān)控項和觸發(fā)器問題_zabbix
- 2022-08-20 C/C++多態(tài)深入探究原理_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支