Linux C:構造數據類型

目錄

一、結構體(struct)

1.1類型定義

1.2 結構體變量定義

1.3 結構體元素初始化

1.4 結構體成員訪問

1.5 結構體的存儲(內存對齊)

1.6 結構體傳參


本文主要記錄了C語言中構造數據類型部分的內容,今天暫時只寫了結構體的內容,關于結構體的定義、變量定義、初始化、訪問、存儲和傳參問題,很好理解,后續共用體(聯合體)和枚舉問題將于明天進行更新。

一、結構體(struct)

結構體是一種自定義的復合數據類型,用于將不同類型的數據組合成一個整體,方便對相關數據進行統一管理和操作。

1.1類型定義

struct 結構體名 {
數據類型1 成員變量1;
數據類型2 成員變量2;
數據類型3 成員變量3;
...
};struct date {
int year;
int mon;
int day;
};struct time {
int hour;
int min;
int sec;
};struct student {
char name[32];
char sex;
int age;
int score;
};

基本格式:使用struct關鍵字,后跟結構體名,大括號內包含多個成員變量(成員可以是基本數據類型、其他結構體類型等),最后以分號結尾。

  • 說明:定義的是結構體類型,并非變量,就像int是類型,不是具體變量一樣。

1.2 結構體變量定義

定義:存儲類型 + 結構體類型 + 變量名。

struct student stu1;? //(定義一個struct student類型的變量stu1

注意:存儲類型可省略,默認是自動存儲類型(auto)。

1.3 結構體元素初始化

  1. 全部初始化:按成員順序依次賦值。
    struct student stu = {"zhangsan", 'm', 18, 90};
  2. 局部初始化:可指定部分成員賦值,未賦值的成員自動為 0(數值型)、空字符(字符型)等默認值。
    ?
    struct student stu = {.name = "zhangsan",  // 指定name成員賦值.score = 90          // 指定score成員賦值
    };
    

1.4 結構體成員訪問

  • 結構體變量訪問成員:使用.運算符,格式為 “結構體變量名 . 成員名”
  • 結構體指針訪問成員:使用->運算符,格式為 “結構體指針名 -> 成員名”
.    :結構體變量類型訪問成員變量 .
->   :結構體指針類型訪問成員變量 ->結構體訪問成員變量最終的類型由成員變量的類型決定

1.5 結構體的存儲(內存對齊)

  1. 結構體成員必須存放在內存地址為自身類型長度整數倍的內存單元中。例如int類型成員(占 4 字節)的地址必須是 4 的倍數。
  2. 結構體的總大小必須為自身最大成員類型長度的整數倍。
  • struct student {char name[32];char sex;int age;int score;
    };

作用:內存對齊是為了提高 CPU 對內存的訪問效率,硬件層面更易讀取對齊的地址。

1.6 結構體傳參

1.傳值方式:函數參數是結構體變量,實參將整個結構體的內容拷貝給形參,缺點是當結構體較大時,拷貝開銷大。

void fun(struct student tmp);

2.傳地址方式:函數參數是結構體指針,實參將結構體的地址傳遞給形參,僅拷貝 8 字節(64 位系統指針大小),效率更高,且可通過指針修改原結構體內容。

void fun(struct student *ptmp);

建議:優先使用傳地址方式,尤其對于大型結構體;

? ? ? ? ? ?傳地址更好,因為實參將8字節拷貝給形參,避免結構體大空間的拷貝;

二. 共用體(union,聯合體)

共用體與結構體的核心區別是所有成員共享同一塊內存空間,空間大小等于最大成員的大小,適用于 “同一空間存儲不同類型數據” 的場景(如節省內存、判斷內存大小端)。

(1)定義與特性
  • 定義格式:union 共用體名 {成員列表};
    union Data {int i;    // 占4字節float f;  // 占4字節char c;   // 占1字節
    };  // 總大小為4字節(最大成員int和float均為4字節)
    
  • 特性:任一時刻只有一個成員有效,修改一個成員會覆蓋其他成員的值。
(2)應用:判斷內存大小端

內存大小端是指多字節數據在內存中的存儲順序:

  • 小端存儲:低地址存儲數據的低字節(如 0x12345678,低地址存 0x78);
  • 大端存儲:低地址存儲數據的高字節(如 0x12345678,低地址存 0x12)。

利用共用體判斷:

#include <stdio.h>
union CheckEndian {int num;    // 4字節char c;     // 1字節(共享num的低地址空間)
};int main() {union CheckEndian u;u.num = 0x12345678;if (u.c == 0x78) {printf("小端存儲\n");  // 低地址存低字節0x78} else if (u.c == 0x12) {printf("大端存儲\n");  // 低地址存高字節0x12}return 0;
}

三. 枚舉(enum)

枚舉用于定義一組命名的常量,使代碼更具可讀性,適用于表示 “有限的狀態或選項”(如顏色、星期、錯誤碼等)

(1)定義與特性
  • 定義格式:enum 枚舉名 {常量1, 常量2, ...};
    enum Weekday {MON,  // 默認為0TUE,  // 默認為1(前一個+1)WED = 5,  // 手動賦值為5THU   // 自動為6(5+1)
    };
    

  • 特性:所有枚舉常量均為 int 類型,不能直接賦值給其他類型(需強制轉換)。
(2)應用場景
  • 狀態標識:如enum Status {SUCCESS, ERROR, PENDING};,比直接用 0、1、2 更易讀。
  • 限制變量取值:enum Color {RED, GREEN, BLUE} c; c = RED;(只能取枚舉中的值)。

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

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

相關文章

Python:self

在Python面向對象編程中&#xff0c;self是一個指向類實例自身的引用參數&#xff1a;?1. 本質與作用??身份標識?&#xff1a;self是類實例化后對象的"身份證"&#xff0c;代表當前實例本身&#xff0c;用于區分不同實例的屬性和方法??自動傳遞?&#xff1a;調…

【SpringMVC】SpringMVC的概念、創建及相關配置

什么是SpringMVC 概述 中文翻譯版&#xff1a;Servlet 棧的 Web 應用 Spring MVC是Spring Framework的一部分&#xff0c;是基于Java實現MVC的輕量級Web框架。 查看官方文檔&#xff1a;https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.h…

淺談存儲過程

問題引入 面試的時候有時候會問到知不知道存儲過程&#xff0c;用沒用過&#xff1f; 是什么 存儲過程&#xff08;Stored Procedure&#xff09;是在大型數據庫系統中&#xff0c;一組為了完成特定功能的SQL 語句集&#xff0c;它存儲在數據庫中&#xff0c;一次編譯后永久…

maven optional 功能詳解

前言 最近參與了一個項目,使用maven管理依賴.項目拆分了很多模塊.然后交個多個團隊各自開發.最后在一個項目骨架中,把各自的模塊引入進來,一起啟動. 后來隨著項目的深入.引入的jar包變多.發現 jar包太多,編譯太慢, 打包之后的war包非常大.這種情況就可以使用optional來優化什么…

Python基礎--Day04--流程控制語句

流程控制語句是計算機編程中用于控制程序執行流程的語句。它們允許根據條件來控制代碼的執行順序和邏輯&#xff0c;從而使程序能夠根據不同的情況做出不同的決策。流程控制實現了更復雜和靈活的編程邏輯。 順序語句 順序語句是按照編寫的順序依次執行程序中的代碼。代碼會按照…

【同濟大學】雙速率自動駕駛架構LeAD:端到端+LLM,CARLA實測93%路線完成率,性能SOTA!

近年來&#xff0c;隨著端到端的技術快速發展將自動駕駛帶到了一個新高度&#xff0c;并且取得了非常亮眼的成績。由于感知限制和極端長尾場景下訓練數據覆蓋不足&#xff0c;模型在高密度復雜交通場景下和不規則交通情況下的處理能力不足&#xff0c;導致在開放道路上大規模部…

github與git新手教程(快速訪問github)

0 序言 作為一個開發者&#xff0c;你必須知道github和git是什么&#xff0c;怎么使用。 github是一個存儲代碼等資源的遠程倉庫&#xff0c;一個大型項目往往需要很多人共同協作開發&#xff0c;而大家如何協同開發的進度與分工等要求需要有一個統一開放保存代碼的平臺。git…

Windows環境下安裝Python和PyCharm

可以只安裝PyCharm嗎&#xff1f;不可以&#xff01;&#xff01;&#xff01; 開發Python應用程序需要同時安裝Python和PyCharm。Python是一種編程語言&#xff0c;PyCharm是一個專門為Python開發設計的集成開發環境&#xff0c;提供豐富的功能以簡化編碼過程。 一、前期準備…

Qt 嵌入式系統資源管理

在嵌入式系統中&#xff0c;資源&#xff08;CPU、內存、存儲、網絡等&#xff09;通常非常有限&#xff0c;因此高效的資源管理對 Qt 應用的穩定性和性能至關重要。本文從內存優化、CPU 調度、存儲管理到電源控制&#xff0c;全面解析 Qt 嵌入式系統資源管理的關鍵技術。 一、…

小杰數據結構(one day)——心若安,便是晴天;心若亂,便是陰天。

1.數據結構計算機存儲、組織數據的方式&#xff1b;有特定關系的數據元素集合&#xff1b;研究數據的邏輯結構、物理結構&#xff08;真實存在&#xff09;和對應的算法&#xff1b;新結構仍保持原結構類型&#xff1b;選擇更高的運行或存儲效率的數據結構。邏輯結構——面向問…

力扣面試150(44/150)

7.30 155. 最小棧 設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 實現 MinStack 類: MinStack() 初始化堆棧對象。void push(int val) 將元素val推入堆棧。void pop() 刪除堆棧頂部的元素。int top() 獲取堆棧頂…

Linux實戰:從零搭建基于LNMP+NFS+DNS的WordPress博客系統

前言 在數字化時代&#xff0c;擁有一個個人博客是技術愛好者展示成果、分享經驗的重要方式。本文將帶您從零開始&#xff0c;在Linux環境下通過兩臺服務器協作&#xff0c;搭建一個功能完整的WordPress博客系統。我們將整合LNMP架構、NFS文件共享和DNS域名解析服務&#xff0c…

Apache Ignite 的對等類加載(Peer Class Loading, P2P Class Loading)機制

這段內容是關于 Apache Ignite 的“對等類加載”&#xff08;Peer Class Loading, P2P Class Loading&#xff09;機制的詳細說明。這是 Ignite 為了簡化開發而設計的一個非常強大的功能&#xff0c;但同時也存在一些安全和性能上的考量。 下面我將用通俗易懂的語言 結構化解…

預過濾環境光貼圖制作教程:第四階段 - Lambert 無權重預過濾(Stage 3)

在完成高光反射的 GGX 預過濾后,我們還需要處理環境光的漫反射部分。本階段(Stage 3)將基于 Lambert 分布對環境貼圖進行無權重預過濾,生成用于漫反射計算的環境數據。與高光反射的方向性不同,漫反射是光線在粗糙表面的均勻散射,因此需要用更適合均勻分布的 Lambert 模型…

Spring與SpringBoot:從手動擋到自動擋的Java開發進化論

大家好&#xff01;我是程序員良辰&#xff0c;今天我們來聊聊Java開發界的兩位"重量級選手"&#xff1a;Spring 和 SpringBoot。它們之間的關系就像手動擋汽車和自動擋汽車——一個給你完全的控制權但操作復雜&#xff0c;一個讓你輕松上路但保留了切換手動模式的能…

1.4.Vue 的模板事件

Vue 的模板事件1. 最常見和推薦的做法。將復雜的邏輯封裝在 methods 中。<!-- ? 正確&#xff1a;調用 methods 中的方法 --> <button click"handleClick">點擊我</button>new Vue({methods: {handleClick(event) {// 這里可以寫任意語句if (this…

SQLite 子查詢詳解

SQLite 子查詢詳解 引言 SQLite 是一種輕量級的數據庫&#xff0c;以其簡單、易用和跨平臺而著稱。在數據庫查詢中&#xff0c;子查詢是一個非常重要的概念&#xff0c;它允許我們在查詢中使用查詢結果。本文將詳細講解 SQLite 中的子查詢&#xff0c;包括其定義、用法以及在實…

可以組成網絡的服務器 - 華為OD統一考試(JavaScript 題解)

題目描述 在一個機房中,服務器的位置標識在n*m的整數矩陣網格中,1表示單元格上有服務器,0表示沒有。如果兩臺服務器位于同一行或者同一列中緊鄰的位置,則認為它們之間可以組成一個局域網,請你統計機房中最大的局域網包含的服務器個數。 輸入描述 第一行輸入兩個正整數,…

redis,MongoDB等未授權訪問靶場復現

redis未授權訪問在docker中啟動vulhub對應的靶場目錄&#xff1a;cd /vulhub-master/redis/4-unacc在kali上安裝redis程序進行服務連接安裝redis apt-get install redis redis鏈接 redis-cli -h IP -p 端口輸入info可以查看信息接下來我們使用redis-rogue-server來獲取命令執行…

設計模式:代理模式 Proxy

目錄問題解決方案結構代碼代理是一種結構型設計模式&#xff0c;讓你能夠提供對象的替代品或其占位符。代理控制著對于原對象的訪問&#xff0c;并允許在將請求提交給對象前后進行一些處理。 問題 為什么要控制對于某個對象的訪問呢&#xff1f; 舉個例子&#xff1a; 有這樣一…