C語言---結構體(格式、用法、嵌套、初始化)、共用體、枚舉類型、typedef類型

目錄

結構體與共用體

1、結構體(struct)

? ? ? ? (1) 格式與用法

????????(2) 結構體允許嵌套

?(3) 結構體成員初始化

? ? ? ? (4) 指針替換變量

????????(5) 求結構體在內存空間所占字節

2、共用體(union)

????????(1) 格式與概念

????????(2) 應用

3、枚舉類型(enum)

? ? ? ? (1) 格式與概念

? ? ? ? ?(2) 應用

4、typedef 類型


結構體與共用體

1、結構體(struct)

? ? ? ? (1) 格式與用法

? ? ? ? ? ? ? ? 其中,標識符首字母必須大寫(規定),最后一行的花括號后必須加分號“;”。用來定義新的數據類型,存放在聲明部分中。

例如,創建一個 struct Student 數據類型:

struct Student
{int id;char name[20];float score;
};

????????對新的數據類型定義變量的方法:

????????a.? 在末行花括號( } )與分號( ;)中間寫入所需變量的個數及名稱,此時變量為全局變量,存放在靜態區;

????????b. 在主函數中輸入創建數據類型名,在其后輸入變量名來定義變量,此時變量為局部變量,存放在棧區。例如:

? ? ? ? ? ? ? ? ? ? ??? ?

注意:

????????在主函數 main 中,成員類型與 struct 中的成員類型一致。

????????“ .?”為結構體成員運算符,是一級運算符,自左至右。

????????例如:使用創建的 struct Student 數據類型定義變量 s ,定義類型成員內容,完成?“1,zhangsan,97.500000” 的輸出效果

int main(void)
{struct Student s;s.id = 1;strcpy(s.name, "zahngsan");//【1】s.score = 97.5;printf("%d,%s,%f\n", s.id,s.name,s.score);return 0;
}

值得注意的是代碼中的【1】位置,不能寫為“ s.name = "zhangsan" ”,數組不能直接進行賦值。

????????(2) 結構體允許嵌套

創建一個?struct Date 數據類型,結構體成員信息如下:

struct Date
{int year;int month;int day;
};

????????使用 struct Student 與 struct Date 兩種數據類型,完成" 1, zhangsan, 97.500000, 2002-3-12?"的輸出效果

struct Student
{int id;char name[20];float score;struct Date birthday;
};int main(void)
{struct Student s;s.id = 1;strcpy(s.name, "zhangsan");s.score = 97.5;s.birthday.year = 2002;s.birthday.month = 3;s.birthday.day = 12;printf("%d, %s, %f,%d-%d-%d \n", s.id, srname, s.score, s.birthday.year, s.birthday.month, s.birthday.day);return 0;
}

?(3) 結構體成員初始化

? ? ? ? a. 全初始化:結構體初始化與結構體成員聲明順序一致,例如:

struct Student s ={1, "zhangsan", 97.5, {2002,3,12}};

? ? ? ? b. 部分初始化:只對部分成員信息做初始化,要修改的內容之間用逗號隔開

int main(void)
{struct Student s = {.id = 1,.score = 97.5,.birthday = {.year = 2002,.month = 3,}};printf("%d, %s, %f,%d-%d-%d \n", s.id, srname, s.score, s.birthday.year, s.birthday.month, s.birthday.day);return 0;
}

? ? ? ? (4) 指針替換變量

????????通過指針可以對成員進行修改,效率更高,否則只是值傳遞

struct Student *p;
p = &s;
p->id += 10;
printf("%d %f\n", p->id, p->name);
//p->name 也可寫為 (*p).id
//推薦 p->name

????????(5) 求結構體在內存空間所占字節

? ? ? ? 內存對齊:數據總線以數據類型的整數倍都數據(整除)。

? ? ? ? 1、默認按照CPU位數對其(8)字節,最終大小必須是8的整數倍;

? ? ? ? 2、在結構體成員中找到最長成員,最終按照該成員長度對其;

? ? ? ? 3、按照結構體聲明的順序,依次將成員保存到結構體內存中,保存的偏移量 / sizeof(成員類型)。

例如:struct Dome 中的成員數據類型依次為 char(黃)、int(藍)、short(橙),存儲如下,又因為要被最長的整除(int 的4個字節),所有該類型的 sizeof 為12。

????????(6) 應用

????????對于 struct Student 中的成員信息

struct Student
{int id;char name[20];float score;
};

? ? ? ? eg1.?單項輸出(printStudent),全部輸出(printStudents)

void printStudent(struct Student *p)
{printf("%d, %s, %f\n", p->id, p->name, p->score);
}void printStudents(struct Student a[], int len)
{int i;for(i = 0;i < len;++i){printStudent(a + i);}
}

? ? ? ? eg2. 交換(swap),逆序(reverseStudents)

void swap(struct Student *a, struct Student *b)
{struct Student t;t = *a;*a = *b;*b = t;
}void revserseStudents(struct Student *a, int len)
{int i;for(i = 0;i < len / 2;++i){swap(a + i, a + len - i - 1);}
}

? ? ? ? eg3. 采用回調函數按名字長度(namecmp)、按成績(scoreStudent)進行排序(sortStudent)


int namecmp(struct Student *p1, struct Student *p2)
{return strcmp(p1->name, p2->name);
}int scorecmp(struct Student *p1, struct Student *p2)
{if(p1->score > p2->score){return 1;}else if(p1->score == p2->score){return 0;}else{return -1;}
}void sortStudent(struct Student *a, int len, int (*pfn)(struct Student *, struct Student *))
{int i, j;for(i = 0;i < len - 1;++i){for(j = i + 1;j < len;++j){if(pfn(a + i, a + j) > 0){swap(a + i, a + j);}}}
}

????????在主函數中的書寫格式

int main(void)
{struct Student a[3] = {{1, "zhangsan", 97.5},{2, "lisi", 98},{3, "wanghu", 95}};int len = sizeof(a) / sizeof(*a);sortStudent(a, len, namecmp);printStudents(a, len);return 0;
}

* 結構體之間不能進行比較排序,但結構體成員之間可以進行比較排序。?

2、共用體(union)

????????(1) 格式與概念

? ? ? ??其中,共用體名滿足標識符要求,且首字母要大寫,共用體成員的內存公用,該類型代碼存放在聲明中,

????????創建 union Demo 數據類型,說明共用體成員的內存是共用的

union Demo
{int i;short s;char c;
};
int main(void)
{    union Demo d;d.i = 1000;d.s = 100;d.c = 10;printf("%u\n", sizeof(d));//輸出結果為 4printf("%d\n", d.i);//輸出結果為 10return 0;
}

?????????說明:內存共用并且會進行覆蓋,i 為int型占4個字節,short占2個字節,char占1個字節,相當于int 先占了第一二三四個格子,short 占第一二個格子,char占第一個格子,覆蓋到最后只剩 char 的一個格子,輸出。?

? ? ? ? 可以運用指針作為類型變量

int main(void)
{union Demo *p;p = &d;printf("%p %p %p\n", &d.i, &d.s, &d.c);	return 0;
}

????????(2) 應用

????????用來判斷程序大小端存取

union Demo
{int i;char c;
};int main(void)
{union Demo d;d.i = 1;if(d.c == 1){puts("little");}else{puts("big");}return 0;
}

3、枚舉類型(enum)

? ? ? ? (1) 格式與概念

????????枚舉類型(enum),用來自定義一個數據類型,并將常參放入其中。

? ? ? ? 一般格式為:

? ? ? ?

? ? ? ? 其中,標識符首字母依舊要大寫,該類型的所有可能取值稱為“枚舉類型常量”,各取值之間用逗號“,”隔開,最后一個取值后面不需要加任何東西,花括號后的分號“;”不能省略。也可以對其輸出變量(eg1. 中的 w )進行偏移(加法)。例如:

????????創建 enum Week 類型,并將 Week 的所有可能放入其中,并對?w 的后一項進行輸出(可以用 “%d” 進行輸出),輸出的值為變量 w 在枚舉常量的位置,也可以對常量進行賦值,但不能重復(例如下圖 Tue=7)

enum Week
{Sun, Mon, Tue = 7, Wes, Thu, Fri, Sat
};int main(void)
{enum Week w;w = Sun;printf("%d\n", w + 1);//輸出為 Monreturn 0;
}

? ? ? ? ?(2) 應用

????????該類型可以做 switch 函數后面的表達式,例如:(可自行補充其他 case 情況)

enum Week
{Sun, Mon, Tue, Wes, Thu, Fri, Sat
};int main(void)
{enum Week w;switch(w){case Sun:puts("lol");break;case Mon:case Tue:puts("study");break;default:break;}return 0;
}

4、typedef 類型

? ? ? ? 將已有類型的類型名換個名字,在全局區起名,將變量名變為類型的類型名。在全局區起名。可以在數據類型(int、char、short等后加,也可以在struct、union、enum后加),類型名可以是一個標識符,也可以是一個數組,例如:

typedef int INT;
typedef int ARRAY[10];int main(void)
{int i;ARRAY a;printf("%lu\n", sizeof(a));return 0;
}

????????也可以運用指針作為類型名,例如:

typedef struct Demo
{int i;short s;char c;
}Demo, *PDEMO;int main(void)
{Demo d;PDEMO p;p = &d;return 0;
}

【END】

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

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

相關文章

輻射源定位方法簡述

文章目錄 前言 一、按照信息建模分類 1.1.時間參數 1.1.1.到達時間&#xff08;TOA, Time of Arrival&#xff09;定位 1.1.2.到達時間差&#xff08;TDOA, Time Difference of Arrival&#xff09;定位 1.2.角度參數 1.2.1.到達角度&#xff08;AOA, Angle of Arrival&a…

CamX-設置SceneMode:CONTROL_SCENE_MODE_FACE_PRIORITY不生效問題解決

應用設置CONTROL_SCENE_MODE_FACE_PRIORITY設置不生效 問題&#xff1a;app 代碼 CaptureRequest.Builder captureRequestBuilder mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);builder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTRO…

MFC CChartCtrl編程

重點&#xff1a;創建CChartCtrl控件有2種方式1、直接創建CChartCtrl2、窗體上添加Custom Control&#xff08;切記一定不能是Static Text或者Picture Control&#xff0c;否則無法響應鼠標消息&#xff09;&#xff0c;然后根據ID關聯CChartCtrl控件&#xff0c;初始化代碼如下…

從0到1了解熱部署

熱部署&#xff08;Hot Deployment&#xff09;是軟件開發中一種提高開發效率的技術&#xff0c;指的是在應用程序不停止運行的情況下&#xff0c;動態更新代碼、配置或資源&#xff08;如頁面、圖片等&#xff09;&#xff0c;并讓這些修改立即生效的過程。熱部署主要用于開發…

[12月考試] E

[12月考試] E 題目描述 給定 nnn 個正整數 a1,a2,…,ana_1,a_2,\ldots,a_na1?,a2?,…,an?&#xff0c;小 E 可以進行若干次交換&#xff0c;每一次可以交換兩個相鄰的整數。 求小 E 至少要交換多少次&#xff0c;才可以讓 a1a_1a1? 是 nnn 個數里的最小值&#xff0c;ana_n…

kmp復習,需要多看多練

151. 反轉字符串中的單詞 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:string reverseWords(string s) {int n s.size();int i n - 1;string res;while(i > 0){while(i > 0 && s[i] ) i--;if(i < 0) break;int j i;while(i > …

Linux驅動開發筆記(五)——設備樹(下)——OF函數

一、OF函數定義 第6.8講 Linux設備樹詳解-綁定文檔以及OF函數_嗶哩嗶哩_bilibili 《指南》43.9部分 設備樹的功能就是描述設備信息&#xff0c;幫助驅動開發。那么驅動如何獲取設備信息&#xff1f;獲取這些信息的函數linux直接提供&#xff0c;都定義在linux-imx-rel_imx_4.…

8.2-使用字符串存儲 UTF-8 編碼文本

使用字符串存儲 UTF-8 編碼文本 我們在第4章討論過字符串&#xff0c;但現在將更深入地探討它們。新手 Rustacean 常常因為三個原因而卡在字符串上&#xff1a;Rust 傾向于暴露可能的錯誤、字符串比許多程序員想象的要復雜得多&#xff0c;以及 UTF-8。這些因素結合起來&#x…

以AI大模型重構教育新生態,打造“教-學-練-輔-評”一體化智能平臺

在《中國教育現代化2035》與“教育新基建”政策驅動下&#xff0c;教育數字化轉型已進入深水區。如何將AI技術深度融合于教學全流程&#xff0c;實現從“標準化”到“個性化”的跨越&#xff1f;文淵智閣推出的 AI教學大模型建設方案 &#xff0c;以“數據驅動AI潛能&#xff0…

AI在法律合同內容比對的應用實例

在商業世界的復雜交易中&#xff0c;合同是至關重要的法律保障。然而&#xff0c;隨著業務的擴展&#xff0c;合同數量呈指數級增長&#xff0c;合同條款也日趨復雜。對于法務和商務團隊來說&#xff0c;如何高效、準確地進行合同比對&#xff0c;成為一個亟待解決的難題。傳統…

【Maven】Maven多模塊拆分與依賴隔離 的終極深度解析,從 原子級配置 到 企業級架構設計,涵蓋 8大核心維度

Maven多模塊拆分與依賴隔離 的終極深度解析&#xff0c;從 原子級配置 到 企業級架構設計&#xff0c;涵蓋 8大核心維度一、模塊化工程結構設計&#xff08;黃金法則&#xff09;1. 分層架構模板2. 依賴流向控制矩陣二、依賴隔離的原子級配置1. 嚴格依賴管理&#xff08;父POM&…

大模型流式長鏈接場景下 k8s 優雅退出 JAVA

一、 java bootstrap.yml bootstrap.yml 啟動文件增加timeout-per-shutdown-phase spring:lifecycle:timeout-per-shutdown-phase: 30m# 這個值是故意設置這么大的&#xff0c;因為現在推理服務支持深度思考# 為了保證用戶側的連接不被斷開&#xff0c;因此我們需要設置超大 g…

uni-app用css編寫族譜樹家譜樹

需求背景&#xff1a;公司接到一個項目&#xff0c;是需要做一個族譜微信小程序&#xff0c;需要有族譜樹&#xff0c;且可以添加家族人員。 靈感來源&#xff1a;在插件市場中下載了作者 羊羊不想寫代碼 的插件tree-list族譜&#xff0c;樹形列表&#xff0c;可縮放滑動 - DC…

思途JSP學習 0731

繼0730&#xff0c;我們對項目做最后的升級一、刪除功能1、新增復選框輔助刪除條目的選擇修改我們的list.jsp和list.js在列表的第一列增加一列選擇框2、給復選框添加全選與行點擊選擇功能在行選擇功能中&#xff0c;因為此時的選擇框還未生成&#xff0c;所以我們將事件委托給他…

某訊視頻風控參數逆向分析

文章目錄1. 寫在前面2. 接口分析3. 加密分析4. 扣JS代碼【&#x1f3e0;作者主頁】&#xff1a;吳秋霖 【&#x1f4bc;作者介紹】&#xff1a;擅長爬蟲與JS加密逆向分析&#xff01;Python領域優質創作者、CSDN博客專家、阿里云博客專家、華為云享專家。一路走來長期堅守并致力…

[Broken IOS] 配置CLI | 終端用戶界面TUI

鏈接&#xff1a;https://palera.in/ docs&#xff1a;palera1n palera1n 是一款專為 Jailbroken蘋果設備 設計的強大工具&#xff0c;支持運行 iOS/iPadOS/tvOS 15.0 及更新系統 的 iPhone、iPad 和 Apple TV。 該工具通過 DFU 模式 下的底層 USB 通信引導設備&#xff0c;…

論文閱讀|ArxiV 2024|Mamba進一步研究|VSSD

論文地址&#xff1a;pdf 代碼地址&#xff1a;code 文章目錄1.研究背景與動機2. 核心方法2.1 預備知識:mamba-ssm2.2 非因果狀態空間對偶性2.3 視覺狀態空間對偶性模型3. 實驗結果3.1 圖像分類任務3.2 目標檢測任務3.3 語義分割任務3.4 消融實驗4.局限性與結論4.1 局限性4.2 結…

Flutter中 Provider 的基礎用法超詳細講解(二)之ChangeNotifierProvider

目錄 前言 一、什么是ChangeNotifierProvider? 二、ChangeNotifier的簡單用法 1.定義狀態類 2.使用ChangeNotifierProvider提供狀態 3.獲取狀態并監聽更新 1.Consumer 2.通過API方式獲取 1.Provider.of (context) 2.context.watch () 3.context.read () 4.各種獲…

2025電商CPS分銷與推客系統小程序開發:趨勢、架構與實戰解析

一、行業趨勢&#xff1a;CPS模式與社交電商的深度融合1.1 電商行業新趨勢根據《2025年電子商務行業發展趨勢預測報告》&#xff0c;社交電商與內容營銷已成為核心增長點。消費者行為呈現三大特征&#xff1a;消費習慣轉變&#xff1a;線上購物占比超70%&#xff0c;Z世代用戶更…

Conda環境下配置的基本命令

功能命令創建環境conda create -n myenv python3.11激活環境conda activate myenv刪除環境conda env remove -n myenv復制環境conda create -n newenv --clone myenv列出所有環境conda env list列出環境所有包conda list徹底清除某個 Conda 環境中的所有已安裝包&#xff08;但…