C語言復習筆記--自定義類型

? ? ? ? 今天我們來復習一下自定義類型.自定義類型大概分為結構體,枚舉,聯合體,數組這幾種.數組在之前就介紹過.今天我們來看下其他三種.

結構體

? ? ? ? 首先來看結構體.

??結構體類型的聲明

? ? ? ? 之前在操作符的地方簡單認識過結構體.下面我們回顧一下.

????????結構體回顧

????????結構是?些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量。

? ? ? ? ?結構的特殊聲明--匿名結構體

????????上?的兩個結構在聲明的時候省略掉了結構體標簽(tag).

#include <stdio.h>struct
{int a;int b;
}x;
struct
{int a;int b;
}*p;
int main()
{x.a = 10;printf("%d", x.a);//x=*p;//err//不可以這樣進行賦值,雖然兩個結構體內部的結構相同,//但是匿名結構體只能用一次,所以編譯器會把這兩個看成不同類型//struct s;//err//并且無法用匿名結構體在之后創建變量return 0;
}

? ? ? ? 如果想使用多次可以進行typedef重命名.具體見下.

typedef struct
{int a;int b;
}ST;
int main()
{ST st;st.a = 10;printf("%d", st.a);return 0;
}

????????結構的自引用

? ? ? ? 其實是不可以的,如果這樣可以的?話,那么這個結構體的sizeof應該是多少呢?如果可以就沒法解答這個問題了,因為會出現套娃現象,結構體大小會變為無窮大.那么鏈表的節點是如何實現的呢?其實我們可以用結構體指針來代替直接在結構體中創建一個一樣的結構體.如下

? ? ? ? 如果要用typedef使結構體的名字更加簡單方便調用的話,在結構體內自引用使用指針時不要用typedef過的簡單名字.

??結構體內存對齊

? ? ? ? 我們已經了解了結構體的使用下面我們來了解一下結構體的大小.也就是結構體內存對齊.

? ? ? ? 雖然是浪費空間去換取時間,但是空間也不能大肆浪費,所以如何既滿?對?,?節省空間是需要學習的.

S1 和 S2 類型的成員?模?樣,但是 S1?所占空間要大于?S2.

修改默認對齊數

? ? ? ? 對于上述問題也可以通過修改默認對齊數來解決(一般修改的都是2的n次方的數).

#pragma pack(1)
struct S
{char a;int b;char c;
};
int main()
{struct S s;printf("%zd", sizeof(s));return 0;
}
//如果想還原
#pragma pack()
struct S
{char a;int b;char c;
};
int main()
{struct S s;printf("%zd", sizeof(s));return 0;
}

? 結構體傳參

typedef struct S
{char a;int b;char c;
}S;void test1(S s1)
{printf("%c %d %c\n", s1.a, s1.b, s1.c);
}
void test2(S* s2)
{printf("%c %d %c\n", s2->a, s2->b, s2->c);
}
int main()
{S s = {'y',10,'x'};test1(s);test2(&s);return 0;
}

? ? ? ? 上面兩個函數中test2要更好一點.

? ?結構體實現位段

????????什么是位段

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

????????1. 位段的成員必須是 int 、 unsigned int 或 signed int ,在C99中位段成員的類型也可以選擇其他類型(char,一定要是整形大家庭中的).

????????2. 位段的成員名后邊有?個冒號和?個數字.(這個數字代表這個成員所占的比特位).

? ? ? ? 如下,一個簡單的例子

struct S
{
?? ?int a : 2;
?? ?int b : 3;
?? ?char c : 5;
};

? ? ? ? 既然知道了位段的大體結構,下面我們來看下大小?

struct S1
{char a : 2;char b : 3;char c : 5;
};
struct S2
{int a : 2;int b : 3;char c : 5;
};
int main()
{printf("%zd\n", sizeof(struct S1));printf("%zd\n", sizeof(struct S2));return 0;
}

? ? ? ? 輸出結果見下:

?

????????位段的內存分配

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

????????2. 位段的空間上是按照需要以4個字節或者1個字節( char )的?式來開辟的。并且在計算大小時也要遵循內存對齊.(如上求大小例子中的S2所示).

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

????????位段的跨平臺問題

????????位段的應用

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

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

//struct S1
//{
//	char a : 2;
//	char b : 6;
//	char c : 5;
//};
//int main()
//{
//	struct S1 s;
//	char ch;
//	scanf("%c", &ch);
//	s.b = ch;
//	printf("%c", s.b);//在存進位段中時會發生截斷,不要用char類型實驗,這里打出來是截斷之后的
//	return 0;
//}
// 
//換為int實驗
struct S1
{int a : 2;int b : 18;int c : 5;
};
int main()
{struct S1 s;int ch = 0;scanf("%d%d",&s, &ch);s.b = ch;printf("%d %d\n", s.a, s.b);return 0;
}

聯合體

??聯合體類型的聲明

????????聯合體也是由?個或者多個成員構成,這些成員可以不同的類型.但是編譯器只為最?的成員分配?夠的內存空間.聯合體的特點是所有成員共?同?塊內存空間。所以聯合體也叫:共用體.給聯合體其中?個成員賦值,其他成員的值也跟著變化.

? ? ? ? 看一個簡答的例子

union U
{char a;int b;
};
int main()
{union U u;u.b =0x11223348;printf("%c\n", u.a);//48對應的ASCII碼表是Hreturn 0;
}

? ? ? ? 輸出結果見下?

??聯合體的特點

????????聯合的成員是共?同?塊內存空間的,這樣?個聯合變量的??,?少是最?成員的??(因為聯合 ?少得有能?保存最?的那個成員).

????????更加深入的理解一下

?

? ? ? ? 所以聯合體中所有元素的起始位置是相同的.

? 聯合體大小的計算?

????????聯合的???少是最?成員的??

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

? ? ? ? 在計算之前看好是聯合體還是結構體,千萬不要搞混了.

union Un1
{char c[5];//數組的對齊數按照數組的類型的對齊數算int i;
};
//因為有int所以最大對齊數為4
union Un2
{short c[7];int i;
};
int main()
{//下?輸出的結果是什么?printf("%d\n", sizeof(union Un1));printf("%d\n", sizeof(union Un2));return 0;
}

? ? ? ? 輸出結果見下?

????????使?聯合體是可以節省空間的.

????????既然了解了聯合體那么我們來看下一個小練習吧.

寫?個程序,判斷當前機器是?端?還是?端(用到聯合體的知識)

union U
{int a;char b;
};
int main()
{union U u;u.a = 1;if (1 == (int)(u.b)){printf("小端\n");}else{printf("大端\n");}return 0;
}

枚舉類型

??枚舉類型的聲明

? ? ? ? 舉個例子:

enum Colour
{
?? ?RED,
?? ?GREEN,
?? ?BLUE,
};

? ? ? ? 驗證一下

enum Colour
{RED,GREEN,BLUE,
};
int main()
{printf("%d %d %d", RED, GREEN, BLUE);return 0;
}

enum Colour
{RED=2,GREEN,BLUE=5,
};
int main()
{printf("%d %d %d", RED, GREEN, BLUE);return 0;
}

? ? ? ? 如果一個給初始值后下面的沒有給則下面的值為上面值+1.

??枚舉類型的優點

????????簡單的注意一下第五點.?

??枚舉類型的使用

? ? ? ? 這里主要注意的是枚舉常量的賦值.

enum Colour
{RED=2,GREEN,BLUE=5,
};
int main()
{printf("%d %d %d", RED, GREEN, BLUE);// enum Colour c = 0;//在VS中不報錯,但是最好不要這樣做,枚舉類型就要用枚舉類型賦值enum Colour c = RED;//要用枚舉常量賦值return 0;
}

????????那是否可以拿整數給枚舉變量賦值呢?在C語?中是可以的,但是在C++是不?的,C++的類型檢查? 較嚴格

? ? ? ? 以上就是自定義類型的復習了,我們下次復習見.

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

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

相關文章

python jupyter notebook

什么是Jupyter Notebook Jupyter Notebook是一個開源的Web應用程序&#xff0c;允許用戶創建和共享包含實時代碼、方程、可視化和解釋性文本的文檔。它最初由IPython團隊開發&#xff0c;現在已經成為一個獨立的項目&#xff0c;并廣泛用于數據清理和轉換、數值模擬、統計建模…

Linux——https基礎理論

1. 初步認識https協議 ? 屬于應用層 ? 相較于http協議&#xff0c;https在應用層多了一層加密層&#xff0c;為了保證數據安全 ? 簡單理解&#xff1a;https就是對http的加密和解密 2. 中間人攻擊 ? 數據在傳輸過程中&#xff0c;遭第三方篡改。 3. 加密方式 ? 對稱加密&a…

在 C++ 中對類型進行排序

0.前言 在 C 中&#xff0c;我編寫了一個 tuple-like 模板&#xff0c;這個模板能容納任意多且可重復的類型&#xff1a; template<typename... Ts> struct TypeList {};// usage: using List1 TypeList<int, double, char, double>; using List2 TypeList<…

Unity-Socket通信實例詳解

今天我們來講解socket通信。 首先我們需要知道什么是socket通信&#xff1a; Socket本質上就是一個個進程之間網絡通信的基礎&#xff0c;每一個Socket由IP端口組成&#xff0c;熟悉計網的同學應該知道IP主要是應用于IP協議而端口主要應用于TCP協議&#xff0c;這也證明了Sock…

使用Go語言對接全球股票數據源API實踐指南

使用Go語言對接全球股票數據API實踐指南 概述 本文介紹如何通過Go語言對接支持多國股票數據的API服務。我們將基于提供的API文檔&#xff0c;實現包括市場行情、K線數據、實時推送等核心功能的對接。 一、準備工作 1. 獲取API Key 聯系服務提供商獲取訪問密鑰&#xff08;替…

LeetCode 熱題 100 17. 電話號碼的字母組合

LeetCode 熱題 100 | 17. 電話號碼的字母組合 大家好&#xff0c;今天我們來解決一道經典的算法題——電話號碼的字母組合。這道題在 LeetCode 上被標記為中等難度&#xff0c;要求給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合。下面我將詳細講解解…

OpenCV計算機視覺實戰(3)——計算機圖像處理基礎

OpenCV計算機視覺實戰&#xff08;3&#xff09;——計算機圖像處理基礎 0. 前言1. 像素和圖像表示1.1 像素 2. 色彩空間2.1 原色2.2 色彩空間2.3 像素和色彩空間 3. 文件類型3.1 圖像文件類型3.2 視頻文件3.3 圖像與視頻 4. 計算機圖像編程簡史5. OpenCV 概述小結系列鏈接 0. …

Vite 的工作流程

Vite 的工作流程基于其創新的 “預構建 按需加載” 機制&#xff0c;通過利用現代瀏覽器對原生 ES 模塊的支持&#xff0c;顯著提升了開發效率和構建速度。以下是其核心工作流程的詳細分析&#xff1a; 一、開發環境工作流程 1. 啟動開發服務器 冷啟動&#xff1a;通過 npm …

線性DP(動態規劃)

線性DP的概念&#xff08;視頻&#xff09; 學習線性DP之前&#xff0c;請確保已經對遞推有所了解。 一、概念 1、動態規劃 不要去看網上的各種概念&#xff0c;什么無后效性&#xff0c;什么空間換時間&#xff0c;會越看越暈。從做題的角度去理解就好了&#xff0c;動態規劃…

MySQL中sql_mode的設置

■ 57版本原來配置 show variables like %sql_mode%; STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION ■ 修改配置文件 注釋掉sql_mode&#xff0c;并重啟&#xff0c;查看57版本的默認設置 ONL…

MCAL學習(1)——AutoSAR

1.了解AutoSAR及一些概念 AutoSAR是Automotive Open System Architecture ,汽車開放系統架構。 針對汽車ECU的軟件開發架構。已經是汽車電子軟件開發的標準。 OS服務&#xff1a;Freertos 整車廠&#xff08;OEM&#xff09;主要負責應用層算法 一級供應商&#xff1a;生產制…

Vue報錯:Cannot read properties of null (reading ‘xxx‘)

一、報錯問題 Cannot read properties of null (reading style)at patchStyle (runtime-dom.esm-bundler.js:104:22)二、錯誤排查 這類報錯一般是在已經開發好后&#xff0c;后面測試時突然發現的&#xff0c;所以不好排查錯誤原因。 三、可能原因及解決方案 v-if 導致 在 …

25G 80km雙纖BIDI光模塊:遠距傳輸的創新標桿

目錄 一、產品優勢&#xff1a;雙纖與BIDI的獨特價值 易天光通信25G SFP28 ZR 80KM 易天光通信25G SFP28 BIDI ZR 80KM 二、權威認證與技術突破 三、雙纖與BIDI的核心差異解析 四、應用場景&#xff1a;驅動多領域高效互聯 總結 在5G、云計算與數字化轉型的推動下&#xff0c;光…

2025-05-06 學習記錄--Python-注釋 + 打印變量 + input輸入

合抱之木&#xff0c;生于毫末&#xff1b;九層之臺&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、注釋 ?? &#xff08;一&#xff09;、塊注釋 &#x1f36d; 舉例&#xff1a; &#x1f330; # 打印數字 print(2025) …

基于mediapipe深度學習的眨眼檢測和計數系統python源碼

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 1.算法運行效果圖預覽 (完整程序運行后無水印) 2.算法運行軟件版本 人工智能算法python程序運行環境安裝步驟整理_本地ai 運行 python-CSDN博客 3.部分核心程序 &…

怎樣通過API 實現python調用Chatgpt,gemini

怎樣通過API 實現python調用Chatgpt,gemini 以下為你詳細介紹如何設置和調用這些參數,以創建一個類似的 ChatCompletion 請求: 1. 安裝依賴庫 如果你使用的是 OpenAI 的 API 客戶端,需要先安裝 openai 庫。可以使用以下命令進行安裝: pip install openai2. 代碼示例 …

Linux 下MySql主從數據庫的環境搭建

測試環境&#xff1a;兩臺服務器&#xff0c;Mysql版本 8.0&#xff0c;linux版本&#xff1a;Ubuntu 20.04.3&#xff1b; 1.在兩臺服務器上安裝MySql&#xff1b; 2.選一臺作為主服務器&#xff0c;在主服務器上以root用戶進入Mysql&#xff0c;執行以下語句&#xff1a; …

力扣1812題解

記錄 2025.5.7 題目&#xff1a; 思路&#xff1a; 從左下角開始&#xff0c;棋盤的行數和列數&#xff08;均從 1 開始計數&#xff09;之和如果為奇數&#xff0c;則為白色格子&#xff0c;如果和為偶數&#xff0c;則為黑色格子。 代碼&#xff1a; class Solution {pu…

適合java程序員的Kafka消息中間件實戰

創作的初心&#xff1a; 我們在學習kafka時&#xff0c;都是基于大數據的開發而進行的講解&#xff0c;這篇文章為java程序員為核心&#xff0c;助力大家掌握kafka實現。 什么是kafka: 歷史&#xff1a; 誕生與開源&#xff08;2010 - 2011 年&#xff09; 2010 年&#xf…

PDF智能解析與知識挖掘:基于pdfminer.six的全棧實現

前言 在數字化信息爆炸的時代&#xff0c;PDF&#xff08;便攜式文檔格式&#xff09;作為一種通用的電子文檔標準&#xff0c;承載著海量的結構化與非結構化知識。然而&#xff0c;PDF格式的設計初衷是用于展示而非數據提取&#xff0c;這使得從PDF中挖掘有價值的信息成為數據…