C語言:結構體(自定義類型)知識點(包括結構體內存對齊的熱門知識點)

和黛玉學編程呀,大家一起努力呀.............

?


結構體類型的聲明

?回顧一下

struct tag
{
member-list;
}variable-list;

?創建和初始化

我們知道,在C語言中,對于一些數據是必須初始化的,但是結構體怎么創建并且初始化呢?很簡單,直接賦值上就好了

?

#include <stdio.h>
struct Stu
{
char name[20]; //名字
int age; //年齡
char sex[5]; //性別
char id[20]; //學號
};
int main()
{
//按照結構體成員的順序初始化
struct Stu s = { "張三", 20, "男", "20230818001" };
printf("name: %s\n", s.name);
printf("age : %d\n", s.age);
printf("sex : %s\n", s.sex);
printf("id : %s\n", s.id);
//按照指定的順序初始化
struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex = "?
printf("name: %s\n", s2.name);
printf("age : %d\n", s2.age);
printf("sex : %s\n", s2.sex);
printf("id : %s\n", s2.id);
return 0;
}

結構體的特殊聲明?:

在聲明結構體的時候可以不完全聲明,也就是在struct后面不寫東西,比如上面的把Stu去掉?

結構體的自引用?

? 遞歸里面我們知道它用到了自己,那結構體可以包含一個類型為該結構本身的成員嗎??

來看一下吧

struct Node
{int data;struct Node* next;
};

結構體的內存對齊?

?對齊規則:

1.結構體的第?個成員對?到和結構體變量起始位置偏移量為0的地址處
2.其他成員變量要對?到某個數字(對?數)的整數倍的地址處

對?數=編譯器默認的?個對?數與該成員變量??的較?值。(VS 中默認的值為 8?
Linux中gcc沒有默認對?數,對?數就是成員??的??)

3.結構體總??為最?對?數(結構體中每個成員變量都有?個對?數,所有對?數中最?的)的整數倍。
4.如果嵌套了結構體的情況,嵌套的結構體成員對?到??的成員中最?對?數的整數倍處,結構體的整體??就是所有最?對?數(含嵌套結構體中成員的對?數)的整數倍

?

看那么多不如找代碼來練習一下就知道啦

?1.

struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));

在vs上默認值是8?

對于C1,從0開始,然后對于i,它對齊數是4?對?數=編譯器默認的?個對?數與該成員變量??的較?值。

然后就從4開始對齊,他是int類型,占4個字節,占到7,

對于C2,對齊數是1,占到8,這個時候大小為9,從0到8也就是9個格子啦,這是可能會判斷錯的,所以最好畫圖解決

但是由于對齊規則(結構體總??為最?對?數(結構體中每個成員變量都有?個對?數,所有對?數中最?的)的整數倍。),在這個結構體最大對齊數為4,整數倍并且比9大的也就是12啦

?

6d23cbbacc144136bbebbfa42dc624ff.png?

?

ea832956243c433bac5f58289bf8656c.png?

如果我把結構體里面的內容換一個位置呢,結果又會怎么樣呢?

看代碼:

struct S2
{
char c1;
char c2;
int i;
};
printf("%d\n", sizeof(struct S2));

我們再畫圖,c1從0?開始,c2的對齊數是1,從開始的一個字節,然后i的對齊數是4,從4開始4個字節,到7為止,現在大小是8,剛好是最大對齊數的整數倍,所以答案就是8

?

15d131795af14a939a19dec8d4876992.png

fb1bb0ad6c46491cae671cc166bdaba8.png

為什么要內存對齊呢

首先:?不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數據,否則拋出硬件異常

然后:數據結構(尤其是棧)應該盡可能地在?然邊界上對?。原因在于,為了訪問未對?的內存,處理器需要作兩次內存訪問;

總之有那么一個說法,結構體對齊就是拿空間換取時間的做法

在設計結構體的時候,我們為了節省空間又滿足對齊規則,所以盡量把占空間小的成員集中在一起,上面的兩個例子已經可以說明啦

修改默認對齊數?

上面說到,在vs上默認對齊數是8,但是我不想對齊數是8應該怎么修改呢,#pragma 這個預處理指令,可以改變編譯器的默認對?數。

#include <stdio.h>
#pragma pack(1) //設置默認對?數為1
struct S
{
char c1;
int i;
char c2;
};
#pragma pack() //取消設置的對?數,還原為默認
int main()
{
printf("%d\n", sizeof(struct S));
return 0;
}

?注意:結構體傳參的時候,最好傳的是地址,也就是需要使用到指針

結構體實現位段

什么是位段

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

這個位段是為了節省空間

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

?這個時候A就是一個位段類型

eb2ba449fe2441f5b27aa74fcdc6739c.png

這個2,5,10,34是比特的意思,加起來是47比特,?然后8是兩個整型,可以放下47比特

位段的內存分配?
1. 位段的成員可以是 int ?unsigned int? signed int 或者是 char 等類型?
2. 位段的空間上是按照需要以4個字節( int )或者1個字節( char )的?式來開辟的。
3. 位段涉及很多不確定因素,位段是不跨平臺的,注重可移植的程序應該避免使?位段。

?跟結構相?,位段可以達到同樣的效果,并且可以很好的節省空間,但是有跨平臺的問題存在

??位段使?的注意事項:


位段的?個成員共有同?個字節,這樣有些成員的起始位置并不是某個字節的起始位置,那么這些位
置處是沒有地址的。內存中每個字節分配?個地址,?個字節內部的bit位是沒有地址的。?
所以不能對位段的成員使?&操作符,這樣就不能使?scanf直接給位段的成員輸?值,只能是先輸?
放在?個變量中,然后賦值給位段的成員。


然后就到這里啦,你能看到這里,你已經很厲害啦,希望這些知識對你有所幫助啦,干完C語言然后我們就需要學習數據結構啦,這篇也算是數據結構里面的內容哦?

?

?

?

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

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

相關文章

【計算機網絡】TCP 如何實現可靠傳輸

TCP通過三次握手建立連接&#xff0c;四次揮手釋放連接&#xff0c;確保連接建立和連接釋放的可靠。 序列號、檢驗和、確認應答信號、重發機制、連接管理、窗口控制、流量控制、擁塞控制 標準回答 可靠傳輸就是通過TCP連接傳送的數據是沒有差錯、不會丟失、不重復并且按序到達的…

springboot+vue+mysql項目使用的常用注解

實體類常用注解 Data Data 是一個 Lombok 提供的注解&#xff0c;使用 Data 注解可以簡化代碼&#xff0c;使代碼更加簡潔易讀。 作用&#xff1a;自動為類生成常用的方法&#xff0c;包括 getter、setter、equals、hashCode 和 toString 等需要加Lombok的依賴 <depende…

rk3568-一種基于wifi的網絡環境搭建方案

前言&#xff1a; PC--Ubuntu--開發板 三者之間的網絡互相ping通很重要&#xff0c;尤其是ubuntu和開發板互ping成功最關鍵&#xff0c;關系到nfs&#xff0c;tftp等常用的開發手段。現在大多數開發板都帶有wifi芯片&#xff0c;現在提供一種方案可以三個設備無線地搭建網絡環境…

Open3D0.14.1編譯、安裝、demo使用教程

寫在前面 本文內容 Open3D在0.15版之前&#xff0c;沒有提供編譯好的包&#xff0c;要使用C版本必須自己編譯&#xff0c;本文是Open3D0.14.1在Windows下和Linux(Ubuntu1804)下的編譯、使用教程&#xff1b; Open3D其他版本的編譯和使用相關教程見 各個版本的Open3D、PCL的編譯…

STL常見容器(map/multimap容器)---C++

STL常見容器目錄&#xff1a; 8.map/ multimap容器8.1 map基本概念8.2 map構造和賦值8.3 map大小和交換8.4 map插入和刪除8.5 map查找和統計8.6 map容器排序8.6.1 內置類型排序8.6.2 自定義類型排序8.6.3 自定義和內置類型混合排序 8.map/ multimap容器 兩者基本一致&#xff…

用node寫后端環境運行時報錯Port 3000 is already in use

解決方法:關閉之前運行的3000端口,操作如下 1.WindowR輸入cmd確定,打開命令面板 2.查看本機端口詳情 netstat -ano|findstr "3000" 3.清除3000端口 taskkill -pid 41640 -f 最后再重新npm start即可,這里要看你自己項目中package.joson的啟動命令是什…

Flink:動態表 / 時態表 / 版本表 / 普通表 概念區別澄清

博主歷時三年精心創作的《大數據平臺架構與原型實現&#xff1a;數據中臺建設實戰》一書現已由知名IT圖書品牌電子工業出版社博文視點出版發行&#xff0c;點擊《重磅推薦&#xff1a;建大數據平臺太難了&#xff01;給我發個工程原型吧&#xff01;》了解圖書詳情&#xff0c;…

Python+PySide6實現一個選擇文件并做處理的GUI辦公小工具(完整代碼)

目錄 專欄導讀背景安裝注意事項完整代碼結尾專欄導讀 ?? 歡迎來到Python辦公自動化專欄—Python處理辦公問題,解放您的雙手 ?????? 博客主頁:請點擊——> 一晌小貪歡的博客主頁求關注 ?? 該系列文章專欄:請點擊——>Python辦公自動化專欄求訂閱 ?? 此外還…

天翼云登錄參數JavaSrcipt逆向

天翼云登錄參數 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目標網站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目標參數 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四個參數 …

安卓使用ExoPlayer出現膨脹類異常

1.導包 implementation com.google.android.exoplayer:exoplayer-core:2.15.1implementation com.google.android.exoplayer:exoplayer-ui:2.15.1 2.在Androidifest.xml加入權限&#xff0c;我這里加了忘了與讀寫權限 <uses-permission android:name"android.permissio…

【Fastadmin/ThinkPHP5】使用Queue隊列方法詳細步驟

在現代應用開發中&#xff0c;合理利用隊列系統能夠有效提升系統的性能和響應速度&#xff0c;尤其是在處理耗時較長的任務時&#xff0c;如發送大量郵件、執行定時任務等。下面是如何在ThinkPHP框架中設置和使用隊列功能的詳細指南&#xff1a; 1.配置隊列服務 在applicatio…

Tomcat服務部署、優化

一 Tomcat的基本介紹 Tomcat概念 Tomcat 服務器是一個免費的開放源代碼的Web 應用服務器&#xff0c;屬于輕量級應用服務器&#xff0c;在中小型系統和并發訪問用戶不是很多的場合下被普遍使用&#xff0c;是開發和調試 JSP 程序的首選。 當在一臺機器上配置好Apache 服務器…

VMwareWorkstation17.0虛擬機搭建WindowsXP虛擬機(完整安裝步驟詳細圖文教程)

VMwareWorkstation17.0虛擬機搭建WindowsXP虛擬機&#xff08;完整安裝步驟詳細圖文教程&#xff09; 一、Windows XP1.Windows XP簡介2.Windows XP 的下載地址 二、配置 Windows XP 虛擬機運行環境1.新建虛擬機2.選擇類型配置3.插入WinXP光盤映像文件(ISO)4.選擇操作系統5.命名…

Home Assistant:基于Python的智能家居開源系統詳解

Home Assistant&#xff1a;基于Python的智能家居開源系統詳解 在數字化和智能化的時代&#xff0c;智能家居系統成為了現代家庭的新寵。它們能夠讓我們更加方便地控制家中的各種設備&#xff0c;實現自動化和個性化的居住體驗。其中&#xff0c;Home Assistant作為一款基于Pyt…

美易官方:3月1日美股成交額前20

3月1日&#xff0c;美股市場熱鬧非凡&#xff0c;成交額前20的公司股票交易活躍&#xff0c;其中&#xff0c;英偉達&#xff08;NVIDIA&#xff09;的股價收在800美元之上&#xff0c;創下了歷史新高。這一天的股市走勢充分展示了投資者對于科技股的熱烈追捧&#xff0c;同時也…

手機NFC錄入門禁數據,實現手機開門

近場通信&#xff08;Near Field Communication&#xff0c;簡稱NFC&#xff09;&#xff1a; 是一種新興的技術&#xff0c;使用了NFC技術的設備&#xff08;例如移動電話&#xff09;可以在彼此靠近的情況下進行數據交換&#xff0c;是由非接觸式射頻識別&#xff08;RFID&am…

【二分】二分模板+二分題目

一、樸素二分 . - 力扣&#xff08;LeetCode&#xff09;. - 備戰技術面試&#xff1f;力扣提供海量技術面試資源&#xff0c;幫助你高效提升編程技能,輕松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/binary-search/description/ int left 0, right nums.…

【leetcode】隨機鏈表的復制

大家好&#xff0c;我是蘇貝&#xff0c;本篇博客帶大家刷題&#xff0c;如果你覺得我寫的還不錯的話&#xff0c;可以給我一個贊&#x1f44d;嗎&#xff0c;感謝?? 點擊查看題目 思路: struct Node* copyRandomList(struct Node* head) {struct Node* curhead;//1.copy原鏈…

MWC 2024丨美格智能CEO杜國彬出席中國聯通創新成果發布會并發表主題演講

2月26日&#xff0c;中國聯通在MWC2024 巴塞羅那期間舉辦了以“算網為基&#xff0c;智領未來”為主題的創新成果發布會&#xff0c;集中展示最新的創新成果與最佳實踐。 中國通信標準化協會理事長聞庫、GSMA首席財務官Louise Easterbrook、中國聯通副總經理梁寶俊、華為ICT銷…

每日一“類“:深入理解Qt的心臟《QObject》

Qt框架以其強大的跨平臺能力和豐富的用戶界面元素而廣受開發者歡迎&#xff0c;而QObject類無疑是Qt框架心臟的所在。本文將深入探討QObject&#xff0c;揭示其提供的核心功能以及如何在Qt項目中有效利用這個基類。 核心功能 信號與槽 Qt獨特的信號與槽機制是其事件通信的基…