【C語言結構體】用戶自定義類型--結構體,結構體傳參,位段,聯合體和枚舉【圖文詳解】

歡迎來CILMY23的博客喔,本篇為【C語言結構體】用戶自定義類型--結構體,結構體傳參,位段,聯合體和枚舉【圖文詳解】,感謝觀看,支持的可以給個一鍵三連,點贊關注+收藏。

?前言

上一篇(http://t.csdnimg.cn/ruaRw)我們講到C語言中,用戶可以自定義類型,結構體,

?本期將講解結構體的傳參,和位段,聯合體以及枚舉類型。

浮點數的取值范圍:float.h 整型的取值范圍:limits.h

今日語句分享:一個人走慢點也并無害處,因為他的輝煌不在于行走,而在于親身體驗。

目錄

一、結構體傳參

二、位段

三、聯合體

四、枚舉?


一、結構體傳參

結構體傳參也分傳值調用和傳址調用

首先我們來看傳值調用:

struct S
{int b[100];int num;
};void print1(struct S t)
{printf("%d %d %d %d\n", t.b[0], t.b[1], t.b[2], t.num);
}int main()
{struct S s = { {1,2,3},100 };print1(s);
}

結果如下:

?

我們接著來看傳址調用

void print2(struct S* pt)
{printf("%d %d %d %d\n", pt->b[0], pt->b[1], pt->b[2], pt->num);
}int main()
{struct S s = { {1,2,3},100 };print2(&s);
}

結果如下:

?

二、位段

結構體傳參后,我們得講結構體的另外一個能力---位段

2.1什么是位段

位段就是以下這樣的代碼,它是基于結構體實現的,它的出現是為了節省空間位是二進制位的意思

struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 15;
};

位段的聲明和結構體聲明是類似的,有兩個不同:

1. ? ?位段的成員必須是int、unsigned int 或signed int ,在C99中位段成員的類型也可以選擇其他類型。
2. ? ?位段的成員名后邊有?個冒號和?個數字。?

2.2位段的大小

位段的出現既然是為了節省空間,那上面那段代碼如何解讀呢?

如下所示:

實際上在冒號后面的數字代表的是bit,有幾個數字就有幾個bit位置。?

#include <stdio.h>struct A
{int _a : 2;int _b : 5;int _c : 10;int _d : 15;
};struct B
{int _a;int _b;int _c;int _d;
};int main()
{struct A a;struct B b;printf("%d\n", sizeof(a));printf("%d\n", sizeof(b));
}

?結果如下:

?解釋:

2.3位段的內存分配

?看以下這段代碼:

struct S
{char a : 3; char b : 4; char c : 5; char d : 4;
};int main()
{struct S s = { 0 };printf("%d ",sizeof(s));
}

?結果如下:

我們看到大小是3,但是實際上?

1.????位段中內存的空間使用是從左到右還是從右到左使用是不確定的

2.? ? 當前面使用,剩余的空間不足下一個成員存儲,是否繼續使用剩余的空間是不確定的。

那我們接著看下面這段代碼:?

#include <stdio.h>struct S
{char a : 3; char b : 4; char c : 5; char d : 4;
};int main()
{struct S s = { 0 };s.a = 10;s.b = 12;s.c = 3;s.d = 4;printf("%d ",sizeof(s));
}

我們假設在vs上內存分布是從右到左的?

?這里有三個字節

?首先a分配三個bit位,a的數值是10,轉換成二進制是1010,因為只分配3個bit,所以存入010,b的數值是12,轉換成二進制是1100,因為分配4個bit,而之前使用剩余空間足夠,我們繼續存入,c的數值是3,轉換成二進制是011,而分配5個bit,所以存入011,其余用0補齊,d的數值是4,轉換成二進制是100,分配4個bit,由于之前分配給c的bit位置不夠了,我們再拿一個字節來存d,將100存入,然后再用0補齊

那在vs上到底是如何呢?

結果是顯而易見的,正如我們所想的這樣

2.3位段的跨平臺問題?

1. ? ?int在位段中被當成有符號數還是無符號數是不確定的。
2. ? ?位段中最大位的數目不能確定。(16位機器最大16,32位機器最大32,寫成27,在16位機器會出問題。)
3. ? ?位段中的成員在內存中從左向右分配,還是從右向左分配標準尚未定義。
4. ? ?當一個結構包含兩個位段,第二個位段成員比較大,無法容納于第?個位段剩余的位時,是舍棄剩余的位還是利用,這是不確定的。?

2.4 總結

位段總結:

1. ? ?位段的成員可以是int,unsigned int,signed int 或者是char 等類型。

2. ? ?位段的空間上是按照需要以4個字節(int)或者1個字節(char)的方式來開辟的。

3. ? ?位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應該避免使用位段。?

三、聯合體

像結構體一樣,聯合體也是由一個或者多個成員構成,這些成員可以不同的類型。但是編譯器只為最大的成員分配足夠的內存空間。聯合體的特點是所有成員共用同一塊內存空間。所以聯合體也叫:共用體。

3.1聯合體的類型聲明

?union是聯合體的關鍵字,我們對其聲明也跟結構體類似

union U
{char c;int i;
};

3.2聯合體的大小和內存分布

聯合體的大小:

union U
{char c;int i;
};int main()
{union U u = { 0 };printf("%d ", sizeof(union U));
}

結果如下:?

?

那為什么是4呢?這還要從聯合體的成員地址看起

?

我們通過上圖可以看到每個成員的地址的都是一樣的 ,這說明聯合體當中每個成員都是用同一個空間,所以給聯合體其中一個成員賦值,其他成員的值也跟著變化。

?3.3聯合體大小的計算

union Un1
{char c[5];int i;
};union Un2
{char c[7];int i;
};
int main()
{//下?輸出的結果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;
}

?結果如下:

?聯合體同樣涉及內存對齊

所以un1對齊到8字節,同樣un2也是對齊到8字節

總結:

聯合的大小至少是最大成員的大小。

當最大成員大小不是最大對齊數的整數倍的時候,就要對齊到最大對齊數的整數倍。?

3.4聯合體的練習?

寫一個程序判斷大小端字節序(這個我們之前寫過:http://t.csdnimg.cn/gIUL5)?

int check_sys()
{union U{int i;char c;}u;u.i = 1;return u.c;
}

?那我們可以利用這個聯合體共用一個空間的特性來解決大小端,然后設計一個函數,最后返回c 的值即可。

四、枚舉?

4.1枚舉的類型聲明

枚舉顧名思義就是一一列舉。
把可能的取值一一列舉。

就比如以下這段代碼:?

enum Day
{Mon,Tues,Wed,Thur,Fri,Sat,Sun
};

?以上定義的enum Day是枚舉類型。{}中的內容是枚舉類型的可能取值,也叫枚舉常量。這些可能取值都是有值的,默認從0開始,依次遞增1,當然在聲明枚舉類型的時候也可以賦初值。

enum Day//星期
{Mon = 8,Tues = 10,Wed = 99,Thur = 54,Fri = 55,Sat = 22,Sun = 66
};

4.2枚舉的優點?

我們可以使用? ?#define 定義常量,為什么非要使用枚舉?

枚舉的優點:
1. ? ?增加代碼的可讀性和可維護性
2. ? ?和#define定義的標識符比較枚舉有類型檢查,更加嚴謹。
3. ? ?便于調試,預處理階段會刪除#define 定義的符號
4.? ? 使用方便,?次可以定義多個常量
5. ? ?枚舉常量是遵循作用域規則的,枚舉聲明在函數內,只能在函數內使用?

4.3枚舉類型的使用

?假設我們想描述一個人的性別, 我們就可以用枚舉常量給枚舉類型的變量賦值。那是否可以拿整數給枚舉變量賦值呢?在C語言中是可以的,但是在C++是不行的,C++的類型檢查比較嚴格。

enum Sex
{	MALE,FEMALE,SECREAT
};int main()
{enum Sex S = FEMALE;return 0;
}

感謝各位同伴的支持,本期位段篇就講解到這啦,如果你覺得寫的不錯的話,可以給個一鍵三連,點贊關注+收藏,若有不足,歡迎各位在評論區討論。???

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715182.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715182.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715182.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GO—函數

Go 語言支持普通函數、匿名函數和閉包&#xff0c;從設計上對函數進行了優化和改進&#xff0c;讓函數使用起來更加方便。 Go 語言的函數屬于“一等公民”&#xff08;first-class&#xff09;&#xff0c;也就是說&#xff1a; 函數本身可以作為值進行傳遞。支持匿名函數和閉…

Leetcode.2369 檢查數組是否存在有效劃分

題目鏈接 Leetcode.2369 檢查數組是否存在有效劃分 rating : 1780 題目描述 給你一個下標從 0 0 0 開始的整數數組 n u m s nums nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為…

推薦6款SSH遠程連接工具

1、Xshell 介紹&#xff1a; xshell是一個非常強大的安全終端模擬軟件&#xff0c;它支持SSH1, SSH2, 以及Windows平臺的TELNET 協議。Xshell可以在Windows界面下用來訪問遠端不同系統下的服務器&#xff0c;從而比較好的達到遠程控制終端的目的。 業界最強大的SSH客戶機 官…

數據分析-Pandas數據的直方圖探查

數據分析-Pandas數據的直方圖探查 數據分析和處理中&#xff0c;難免會遇到各種數據&#xff0c;那么數據呈現怎樣的規律呢&#xff1f;不管金融數據&#xff0c;風控數據&#xff0c;營銷數據等等&#xff0c;莫不如此。如何通過圖示展示數據的規律&#xff1f; 數據表&…

農產品質量追溯系統—功能介紹(2)

儲藏管理 儲藏信息管理對需要儲藏的農產品,記錄儲藏的相關信息,如儲藏開始時間、存放倉庫、操作人員、儲藏原因等; 倉庫信息管理物流管理 物流公司管理對相關的物流公司信息進行登記,以便于管理和追溯; 車輛管理

我的秋招數據分析崗面經分享(京東,美團,阿里,拼多多,vivo,滴滴)

節前&#xff0c;我們社群組織了一場技術&面試討論會&#xff0c;邀請了一些互聯網大廠同學、參加社招和校招面試的同學&#xff0c;針對新手如何入門數據分析、機器學習算法、該如何備戰面試、面試常考點分享等熱門話題進行了深入的討論。 基于社群的討論&#xff0c;今天…

力扣爆刷第84天之hot100五連刷6-10

力扣爆刷第84天之hot100五連刷6-10 文章目錄 力扣爆刷第84天之hot100五連刷6-10一、15. 三數之和二、42. 接雨水三、3. 無重復字符的最長子串四、438. 找到字符串中所有字母異位詞五、560. 和為 K 的子數組 一、15. 三數之和 題目鏈接&#xff1a;https://leetcode.cn/problem…

JAVA學習筆記13(位運算)

1.位運算 1.1 原碼、反碼、補碼 ? *規則&#xff1a; ? 1.二進制的最高位是符號位&#xff1a;0表示正數&#xff0c;1表示負數 ? 2.正數的原碼&#xff0c;反碼&#xff0c;補碼都一樣&#xff08;三碼合一&#xff09; ? 3.負數的反碼 他的原碼符號位不變&#xff…

從metashape導出深度圖,從深度圖恢復密集點云

從metashape導出深度圖&#xff0c;從深度圖恢復密集點云 1.從metashape導出深度圖 參考&#xff1a;https://blog.csdn.net/WHU_StudentZhong/article/details/123107072?spm1001.2014.3001.5502 2.從深度圖建立密集點云 首先從metashape導出blockExchange格式的xml文件&…

OpenHarmony、HarmonyOS打開編輯 PDF 等操作的三方組件使用教程

項目場景: 隨著數字化時代的發展,PDF 文檔成為廣泛應用于各行業的重要文件格式。為了提高OpenHarmony/HarmonyOS生態系統的功能性和用戶體驗,我們需要一款支持打開、編輯PDF文件的應用程序。 使用戶能夠輕松打開、瀏覽和編輯PDF文件。該應用將充分利用OpenHarmony/HarmonyO…

【NTN 衛星通信】衛星和無人機配合的應用場景

1 場景概述 衛星接入網是一種有潛力的技術&#xff0c;可以為地面覆蓋差地區的用戶提供無處不在的網絡服務。然而&#xff0c;衛星覆蓋范圍對于位于考古或采礦地點內部/被茂密森林覆蓋的村莊/山谷/靠近山丘或大型建筑物的用戶可能很稀疏。因此&#xff0c;涉及衛星接入和無人駕…

HarmonyOS Full SDK的安裝

OpenHarmony的應用開發工具HUAWEI DevEco Studio現在隨著OpenHarmony版本發布而發布,只能在版本發布說明中下載,例如最新版本的OpenHarmony 4.0 Release。對應的需要下載DevEco Studio 4.0 Release,如下圖。 圖片 下載Full SDK主要有兩種方式,一種是通過DevEco Studio下載…

教你用Fiddler捕獲HTTPS請求

安裝Fiddler 這里不特別說明了&#xff0c;網上搜索一大把&#xff0c;根據安裝引導一步步安裝即可。&#xff08;這里采用的是fiddler v4.6&#xff09; 配置Fiddler 1、打開fiddler配置Tools –>Telerik Fiddler Options。 2、打開HTTPS配置項&#xff0c;勾選“Captur…

【程序員養生延壽系列-萬人關注的養生指南 4 】

1.早起一杯溫水&#xff0c;疏通腸胃&#xff0c;補充水分。 2.早十點和下午三點左右活動活動身體&#xff08;運動or健身&#xff09;&#xff0c;放松緊張疲憊的身體&#xff0c;幫助消化&#xff0c;給身體透個氣。 3.每天散步&#xff0c;好處多多&#xff08;減肥健身&a…

ctf_show筆記篇(web入門---爆破)

爆破 21&#xff1a;直接bp抓包跑字典&#xff0c;需base64加密 22&#xff1a;可用工具跑也可用瀏覽器找還可以用網上做好的域名查找去找 23&#xff1a;此題需跑腳本已經附上自寫腳本 最后跑出來六個答案一個一個嘗試得到答案為3j import hashlibm "0123456789qwert…

C++_AVL樹

目錄 1、AVL的概念 2、平衡因子的調整概念 3、AVL樹的插入 3.1 調整平衡因子代碼實現 3.2 右旋操作 3.2 左旋操作 3.3 雙旋-先右旋再左旋 3.4 雙旋-先左旋再右旋 3.5 旋轉操作的小結 4、AVL的驗證與實現 結語 前言&#xff1a; 在C中&#xff0c;AVL樹是在二叉搜索…

2024中國眼博會,山東省眼科醫學技術交流大會

以展帶會&#xff0c;以會促展&#xff0c;展與會有機結合&#xff0c;立足山東打造具全國影響力的眼康產業發展盛會&#xff1b; ——隨著時代的高速發展&#xff0c;科技的進步&#xff0c;現代生活節奏的加快&#xff0c;青少年近視問題日益嚴重&#xff0c;對兒童青少年的…

舊的Spring Security OAuth已停止維護,全面擁抱新解決方案Spring SAS

Spring Authorization Server 替換 Shiro 指引 背景 Spring 團隊正式宣布 Spring Security OAuth 停止維護&#xff0c;該項目將不會再進行任何的迭代 目前 Spring 生態中的 OAuth2 授權服務器是 Spring Authorization Server 已經可以正式生產使用作為 SpringBoot 3.0 的最新…

如何使用naive 做一個模態框的方式

1.我的問題使用了一個table 表格&#xff0c;在表格中設置倆個按鈕 最后做出來的效果 <template><div><h1>測試文件</h1><!-- 表格 --><n-data-table :columns"columns" :data"data" :pagination"pagination" …

Linux內核隊列queue.h

文章目錄 一、簡介二、SLIST單向無尾鏈表2.1 介紹2.2 操作2.3 例子 三、STAILQ單向有尾鏈表四、LIST雙向無尾鏈表五、TAILQ雙向有尾鏈表六、CIRCLEQ循環鏈表七、queue源碼參考 一、簡介 queue.h是一個非常經典的文件&#xff0c;定義了一系列宏的操作&#xff0c;它定義了一系…