C語言初學者筆記【結構體】

文章目錄

  • 一、結構體的使用
    • 1. 結構體聲明
    • 2. 變量創建與初始化
    • 3. 特殊聲明與陷阱
  • 二、內存對齊
    • 1. 規則:
    • 2. 示例分析:
    • 3. 修改默認對齊數:
  • 三、結構體傳參
  • 四、結構體實現位段
    • 1. 定義
    • 2. 內存分配
    • 3. 應用場景
    • 4. 跨平臺問題:
    • 5. 注意事項:
  • 關鍵總結

一、結構體的使用

1. 結構體聲明

struct Stu {        // struct 關鍵字 + 標簽(tag)char name[20];  // 成員變量int age;        // 成員類型可不同char sex[5];char id[20];
};                  // 分號不可省略

2. 變量創建與初始化

// 順序初始化
struct Stu s1 = {"張三", 20, "男", "20230818001"};// 指定成員初始化(C99+)
struct Stu s2 = {.age=18, .name="lisi", .id="20230818002", .sex="女"};

3. 特殊聲明與陷阱

· 匿名結構體(只能使用一次):

struct { int a; char b; } x;  // 無標簽
struct { int a; char b; } *p;
p = &x;  // 錯誤!編譯器認為兩者類型不同

· 自引用正確方式:

struct Node {         // 錯誤:struct Node next;(無限遞歸)int data;struct Node* next; // 正確:使用指針
};

· typedef 陷阱:

typedef struct {      // 錯誤:內部提前使用Nodeint data;Node* next;      // ? 未定義
} Node;// 正確寫法
typedef struct Node {int data;struct Node* next;
} Node;

二、內存對齊

1. 規則:

· 首成員偏移量 = 0
· 其他成員對齊數 = min(編譯器默認對齊數, 成員大小)
· VS默認對齊數 = 8,Linux gcc無默認值(對齊數=成員大小)
· 結構體總大小 = 最大對齊數的整數倍
· 嵌套結構體:嵌套的結構體成員對齊到自身內部最大對齊數的整數倍處,結構體的整體大小是所有元素中最大對齊數的整數倍

2. 示例分析:

struct S1 { char c1; int i; char c2; }; // 大小=12 (1+3填充+4+1+3填充)
struct S2 { char c1; char c2; int i; }; // 大小=8  (1+1+2填充+4)

節省空間技巧:將小成員集中放置(對比S1 vs S2)

3. 修改默認對齊數:

#pragma pack(1)      // 對齊數設為1(無填充)
struct S { char c1; int i; char c2; }; // 大小=6
#pragma pack()       // 恢復默認對齊數

三、結構體傳參

· 傳地址優于傳結構體:

void print(struct S* ps) {  // ? 推薦:傳遞指針(4/8字節)printf("%d\n", ps->num);
}
void print(struct S s) {    // ? 避免:大結構體拷貝開銷大printf("%d\n", s.num);
}

原因:傳值導致拷貝開銷,降低性能。


四、結構體實現位段

1. 定義

:二進制位(比特位)

struct A {             // 位段聲明int _a:2;         // 占2比特int _b:5;         // 占5比特int _c:10;        // 占10比特int _d:30;        // 占30比特(不能超過自身大小,即<=32)
};                    // 總大小:8字節(2個int)

· 成員主要為整形

2. 內存分配

· 空間按需以4字節(int)或1字節(char)開辟
· 給定空間后,成員在字節內的分配順序由編譯器決定(從左向右/從右向左)
· 當剩余空間不夠存儲一個成員時,剩余空間是浪費與否也取決于編譯器

3. 應用場景

. 如_a中只需要存儲0、1、2、3數字,則_a只需要兩個比特位的空間,避免空間的浪費
· 網絡協議頭(如IP數據報):
| 4位版本號 | 4位首部長度 | 8位服務類型 | 16位總長度 | ...
用位段精簡存儲(如4位版本號僅需半字節)


4. 跨平臺問題:

· int位段符號不確定(signed/unsigned)
· 最大位數依賴機器(16位機最大16,32位機最大32)
· 剩余位處理方式不確定(舍棄或利用)

5. 注意事項:

struct A sa;
scanf("%d", &sa._b);  // ? 錯誤:位段成員無獨立地址
// 正確做法:
int b;
scanf("%d", &b);
sa._b = b;

關鍵總結

主題 要點
結構體聲明 分號不可省;避免匿名結構體自引用
內存對齊 掌握4條規則;通過成員排序節省空間;#pragma pack修改對齊數
傳參方式 首選傳地址(避免拷貝開銷)
位段 節省空間但不可移植;成員無地址;慎用于跨平臺程序
應用場景 協議封裝、硬件寄存器映射等空間敏感場景

注:位段內存分配示例(假設小端存儲):

struct S { char a:3; char b:4; char c:5; char d:4; };
struct S s = {0};
s.a = 10; // 二進制: 010 (存儲低3位)
s.b = 12; // 二進制: 1100 (存儲后續4位)
// 內存布局: | 1100 010 | ???? ??? | ... |

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

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

相關文章

基于XGBoost算法的數據回歸預測 極限梯度提升算法 XGBoost

一、作品詳細簡介 1.1附件文件夾程序代碼截圖 全部完整源代碼&#xff0c;請在個人首頁置頂文章查看&#xff1a; 學行庫小秘_CSDN博客?編輯https://blog.csdn.net/weixin_47760707?spm1000.2115.3001.5343 1.2各文件夾說明 1.2.1 main.m主函數文件 該MATLAB 代碼實現了…

數據安全系列4:常用的對稱算法淺析

常用的算法介紹 常用的算法JAVA實現 jce及其它開源包介紹、對比 傳送門 數據安全系列1&#xff1a;開篇 數據安全系列2&#xff1a;單向散列函數概念 數據安全系列3&#xff1a;密碼技術概述 時代有浪潮&#xff0c;就有退去的時候 在我的博客文章里面&#xff0c;其中…

云計算學習100天-第26天

地址重寫地址重寫語法——關于Nginx服務器的地址重寫&#xff0c;主要用到的配置參數是rewrite 語法格式&#xff1a; rewrite regex replacement flag rewrite 舊地址 新地址 [選項]地址重寫步驟&#xff1a;#修改配置文件(訪問a.html重定向到b.html) cd /usr/local/ngin…

【Python辦公】字符分割拼接工具(GUI工具)

目錄 專欄導讀 項目簡介 功能特性 ?? 核心功能 1. 字符分割功能 2. 字符拼接功能 ?? 界面特性 現代化設計 用戶體驗優化 技術實現 開發環境 核心代碼結構 關鍵技術點 使用指南 安裝步驟 完整代碼 字符分割操作 字符拼接操作 應用場景 數據處理 文本編輯 開發輔助 項目優勢 …

Windows 命令行:dir 命令

專欄導航 上一篇&#xff1a;Windows 命令行&#xff1a;Exit 命令 回到目錄 下一篇&#xff1a;MFC 第一章概述 本節前言 學習本節知識&#xff0c;需要你首先懂得如何打開一個命令行界面&#xff0c;也就是命令提示符界面。鏈接如下。 參考課節&#xff1a;Windows 命令…

軟考高級--系統架構設計師--案例分析真題解析

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言試題一 軟件架構設計一、2019年 案例分析二、2020年 案例分析三、2021年 案例分析四、2022年 案例分析試題二 軟件系統設計一、2019年 案例分析二、2020年 案例分…

css中的性能優化之content-visibility: auto

content-visibility: auto的核心機制是讓瀏覽器智能跳過屏幕外元素的渲染工作&#xff0c;包括布局和繪制&#xff0c;直到它們接近視口時才渲染。這與虛擬滾動等傳統方案相比優勢明顯&#xff0c;只需要一行CSS就能實現近似效果。值得注意的是必須配合contain-intrinsic-size屬…

通過uniapp將vite vue3項目打包為android系統的.apk包,并實現可自動升級功能

打包vue項目,注意vite.config.ts文件和路由文件設置 vite.config.ts,將base等配置改為./ import {fileURLToPath, URL } from node:urlimport {defineConfig } from vite import vue from @vitejs/plugin-vue import AutoImport from unplugin-auto-import/vite import Com…

經營幫租賃經營板塊:解鎖資產運營新生態,賦能企業增長新引擎

在商業浪潮奔涌向前的當下&#xff0c;企業資產運營與租賃管理的模式不斷迭代&#xff0c;“經營幫” 以其租賃經營板塊為支點&#xff0c;構建起涵蓋多元業務場景、適配不同需求的生態體系&#xff0c;成為眾多企業破局資產低效困局、挖掘增長新動能的關鍵助力。本文將深度拆解…

C語言---編譯的最小單位---令牌(Token)

文章目錄C語言中令牌幾類令牌是編譯器理解源代碼的最小功能單元&#xff0c;是編譯過程的第一步。C語言中令牌幾類 1、關鍵字&#xff1a; 具有固定含義的保留字&#xff0c;如 int, if, for, while, return 等。 2、標識符&#xff1a; 由程序員定義的名稱&#xff0c;用于變…

機器學習 | Python中進行特征重要性分析的9個常用方法

在Python中,特征重要性分析是機器學習模型解釋和特征選擇的關鍵步驟。以下是9種常用方法及其實現示例: 1. 基于樹的模型內置特征重要性 原理:樹模型(如隨機森林、XGBoost)根據特征分裂時的純度提升(基尼不純度/信息增益)計算重要性。 from sklearn.ensemble import Ra…

心路歷程-了解網絡相關知識

在做這個題材的時候&#xff0c;考慮的一個點就是&#xff1a;自己的最初的想法&#xff1b;可是技術是不斷更新的&#xff1b; 以前的材料會落后&#xff0c;但是萬變不能變其中&#xff1b;所以呈現出來的知識點也相對比較老舊&#xff0c;為什么呢&#xff1f; 因為最新的素…

CAT1+mqtt

文章目錄 MQTT知識點mqtt數據固定報頭可變報頭(連接請求)有效載荷 阿里云MQTT測試訂閱Topic下發數據給MQTT.fxMQTT.fx 發布消息給服務器 下載mqtt(C-嵌入式版)我的W5500項目路徑使用Cat1連接阿里云平臺AT指令串口連接1. 開機聯網2. 激活內置SIM卡(貼片卡)3. 我這里使用連接的是…

AiPPT怎么樣?好用嗎?

AiPPT怎么樣&#xff1f;好用嗎&#xff1f;AiPPT 是一款智能高效的PPT生成工具&#xff0c;通過AI技術快速將主題或文檔&#xff08;如Word/PDF&#xff09;轉化為專業PPT&#xff0c;提供超10萬套行業模板&#xff0c;覆蓋商務、教育等22場景&#xff0c;支持一鍵生成大綱、文…

惡補DSP:2.F28335的定時器系統

一、定時器原理F28335 城市的三座時鐘塔&#xff08;Timer0、Timer1、Timer2&#xff09;是城市時間管理的核心設施&#xff0c;每座均為32位精度&#xff0c;依靠城市能源脈沖&#xff08;系統時鐘 SYSCLKOUT&#xff0c;典型頻率為150 MHz&#xff09;驅動。它們由兩個核心模…

用倒計時軟件為考研備考精準導航 復習 模擬考試 日期倒計時都可以用

考研&#xff0c;是一場與時間的博弈。從決定報名的那一刻起&#xff0c;日歷上的每一個數字都被賦予了特殊意義 —— 報名截止日、現場確認期、初試倒計時、成績查詢點…… 這些節點如同航標&#xff0c;指引著備考者的方向。而在這場漫長的征途里&#xff0c;一款精準、易用的…

React學習(七)

目錄&#xff1a;1.react-進階-antd-搜索2.react-進階-antd-依賴項說明 3.react-進階-antd-刪除1.react-進階-antd-搜索我們jsx代碼里只能返回一個最頂層的根元素下拉框簡化寫法&#xff1a;把這個對象結構賦值一下&#xff1a;清空定義個參數類型做修改事件需要定義三個…

Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)進程間通信(IPC)的比較

Unix Domain Socket&#xff08;UDS&#xff09;和 TCP/IP&#xff08;使用 127.0.0.1 或 localhost&#xff09;都是進程間通信&#xff08;IPC&#xff09;的方式&#xff0c;但它們在實現、性能和適用場景上有顯著區別。以下是兩者的對比&#xff1a;1. 通信機制Unix Domain…

SQL中對時間操作的函數

以下是SQL中常用時間操作函數的匯總&#xff0c;按功能分類整理&#xff0c;結合多個權威來源內容綜合而成&#xff1a; 一、獲取當前時間 函數名稱功能說明示例適用數據庫CURDATE()獲取當前日期&#xff08;不含時間&#xff09;SELECT CURDATE(); → 2024-08-21MySQL, Mari…

NUS PC5215 Lecture分析 Week1 Python基礎

NUS PC5215 Lecture分析 Week1 Python基礎前言Python基礎數據類型保留字表達式Import 相關庫IEEE浮點數前言 課程網站 作為一名計算機本科畢業的學生&#xff0c;該課程有點類似于本科期間學的數值分析的進化版&#xff0c;大抵是教會你如何實現各種方法&#xff0c;諸如蒙特卡…