嵌入式培訓之C語言學習完(十七)結構體、共用體、枚舉、typedef關鍵字與位運算

目錄

一、結構體(struct關鍵字)

(一)聲明一個結構體數據類型

(二)結構體的成員初始化與賦值

a、結構體變量賦值

b、結構體成員初始化

c、結構體的定義形式

(三)考點:結構體在內存中所占字節數

(四)對結構體成員進行輸出

(五)例題

二、共用體(union關鍵字)

三、枚舉(enum關鍵字)

四、typedef關鍵字

五、位運算

(一)&? 按位與??

(二)|? 按位或

(三)^ 按位異或?

(四)~ 取反

(五)<< ?左移?

(六)>> ?右移

一、結構體(struct關鍵字)

????????結構體類型—用來描述復雜數據的一種類型,它是構造類型的(用戶自定義類型)一種。

(一)聲明一個結構體數據類型

1、語法:

struct 結構體名//創建抽象的數據類型

{

? ?成員列表;

}

2、理解:

(1)struct關鍵字表示在構造一個結構體類型;

(2)結構體名是用來描述結構體這個類型的一個名稱;

(3)成員列表,它定義的形式,與之前的定義變量的方式是相同的,也用之前的那些

????????數據類型定義,它不僅可以定義變量,還可以定義數組和指針變量;

????????多個成員定義變量的時候,注意要用分號隔開

????????成員列表表示要描述的復雜數據中用到的具體的成員變量;

(4)特別注意在最后的花括號后面要加一個“;”

3、示例:

4、結構體類型的使用:首先先定義出一個類型,再去定義需要的變量,

定義變量的形式是:struct 結構體名 變量名 即?結構體類型+變量名

eg:struct Student s;

(二)結構體的成員初始化與賦值

a、結構體變量賦值

1、示例:

注:(1)"? .? "為結構體成員運算符,優先級為1級,結合方向自左至右;

? ? ? ?(2)不能寫成s.name = "zhangsan";編譯報錯,數組不能被整體引用。

3、結構體變量與變量之間可賦值,示例:

b、結構體成員初始化

1、形式: struct student s={};
? ? ?初始化的時候,看每個成員變量具體是什么數據類型,然后根據各個成員變量自身的數據類型進行初始化;

示例:struct student s={1,"zhangsan",99};//此方法做不到只初始化一個成員

2、初始化次序不能顛倒應與結構體聲明順序保持一致;

3、結構體成員的部分初始化

示例:struct student s={ .id = 1};//其他未初始化的部分全為0;

? ? ? ? ? ?struct student s={ .name = "zhangsan" , .score = 99};//用逗號隔開

c、結構體的定義形式

形式1:先定義類型,然后定義變量

  1. struct Student

  2. {

  3. };

  4. struct Student s;

形式2:定義類型的同時定義變量

  1. struct Student

  2. {

  3. }s;

示例:聲明結構體的同時定義了兩個全局變量(s1,s2)

(三)考點:結構體在內存中所占字節數

內存對齊原則:

1、默認按照計算機位數對齊,64/8=8最終大小必須是8的整數倍;(32位系統下默認4字節對齊)

2、從結構體中的成員中查找最大字節的成員,最終按此成員大小對齊;

3、把每個成員按照聲明順序依次存放入內存,偏移量/sizeof(成員)必須能夠整除。

(注:32位的平臺 :如果有超過4字節 ,按照4字節對齊;如果沒有超過4字節的,則

按成員變量中最大對齊 ;64位的平臺:如果超過4字節的,按超過的最大的成員變量對

齊,如果沒有超過4字節的,則按成員變量中最大對齊)

示例:

圖中代碼printf("%lu\n",sizeof(struct Demo));運行結果為12(占12個字節)

注:內存對齊的原因:空間換時間,提高程序運行效率

(四)對結構體成員進行輸出

1、->:指向結構體成員運算符;

2、指針用指向結構體成員運算符(->),變量用結構體成員運算符(.);

3、輸出函數1:

注:該函數為值傳遞(過程需要拷貝);不建議使用

4、輸出函數2:

注:該函數為指針傳參(效率更好)

(五)例題

1、結構體的遍歷

2、采用回調函數按學生成績排序

3、采用qsort函數按學生名字排序

二、共用體(union關鍵字)

1、共用體:(union)它是共用一塊內存空間(共用了最大成員的空間);

2、語法:

union 共用體名

{

? ?成員變量;

};

3、示例:

4、共用相同的內存空間(所以稱為共用體)

運行結果:4(共占4個字節)

5、訪問時只有最后被賦值的變量是有效的(彼此內存相互覆蓋)

運行結果為1

6、4個字節被3個長度不同的變量共享時,共享總是從起始部分開始共享的(所有成員起始地址是相同的);

7、用共用體判斷計算機大小端存儲:

三、枚舉(enum關鍵字)

1、含義:將變量的值一個一個列舉出來;變量的值只限于列舉出來的值的范圍內;

2、作用:為了提高代碼的可讀性;

3、語法

enum 枚舉名

{

? ?列舉各種值,//不是成員,是可能的取值(全為常量)

};

注:列舉各種值時,用逗號隔開,不需要類型名;

4、注意事項

(1)枚舉中逐個列舉的值,默認是從0開始;如果有給定的值,則后續沒有給值的枚舉成員依次加1;

(2)枚舉本質是一個int 類型的數據(可以放在switch中使用)

(3)每個值可以用%d輸出。

5、示例:

運行結果:sleep

運行結果為4

運行結果為2(列舉的值默認從0開始)

運行結果為13(有給定的值,后續沒有給值的枚舉常量依次+1)

四、typedef關鍵字

1、typedef——type define

? ? ?它的本意不是定義類型,是給已有的數據類型起別名。

eg:

int a ;//定義了一個int 型變量,a為變量名(具體)

typedef int a; //此時a是int類型的類型名(抽象)

2、示例:

運行結果為4

3、作用:避免寫長長的關鍵字;

此時Student為類型的類型名(抽象)

4、不建議使用其簡化,代碼可讀性差

示例:

a為數組整型,運行結果為40

a為函數的指針的數組,sizeof(a)為80

五、位運算

(一)&? 按位與??

1、& :雙目運算符,優先級為8級,結合方向自左至右;

2、運算規則:一假則假 (任何一個為0,其結果必然為0;兩個都為1,其結果為1);

3、作用:指定位清零

4、示例:

1001 1110?
0011 0010 &
-------------------

0001 0010?

(二)|? 按位或

1、|:雙目運算符,優先級為10級,結合方向自左至右;

2、運算規則:一真則真 (任何一個為1,其結果必然為1;兩個都為0,其結果為0);

3、作用:指定位置1

4、示例:

1001 1110?
0011 0010 |
-------------------

1011 1110?

(三)^ 按位異或?

1、^:雙目運算符,優先級為9級,結合方向自左至右;

2、運算規則:相同為0,不同為1;

3、作用:指定位翻轉,其他位不變

4、示例:

1001 1110?
0011 0010 ^
-------------------

1010?1100

(四)~ 取反

1、~:單目運算符,優先級為2級,結合方向自右至左;

2、運算規則:按位取反(將0變1,1變0);

3、示例:

1001 1110 ?~
-------------------

0110 0001

(五)<< ?左移?

1、<<:雙目運算符,優先級為5級,結合方向自左至右;

2、寫法:a<<n ?(表示將a這個數據左移n位 )(C語言中為邏輯左移)

3、最高位無論是1還是0全丟掉,后面補0

4、作用:指定位清零( ~(1 << n))

5、示例:

0000 0001?
0000 0010
左移1位 ?相當于乘 2 ?

(六)>> ?右移

1、>>:雙目運算符,優先級為5級,結合方向自左至右;

2、寫法:a>>n(表示將 a這個數據 右移 n位)

3、算術右移是看符號位和看數據類型的:

(1)有符號數據類型,右移時,最高位補的是符號位; (算術右移)? ? ?

(2)無符號類型的數據,右移時,最高位補的0 ;(邏輯右移

注:在使用右移運算符時最好定義無符號數據類型(eg:unsigned char)

4、示例:

1000

1100

-----------

0100

0010

右移1位 ?相當于除 2 ??

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

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

相關文章

Python字典:數據操作的核心容器

在Python編程生態中&#xff0c;字典&#xff08;dict&#xff09;是最常用且功能強大的內置數據結構之一。它以鍵值對&#xff08;Key-Value Pair&#xff09;的形式存儲數據&#xff0c;為快速查找、靈活映射關系提供了天然支持。無論是數據清洗、算法實現還是Web開發&#x…

按位寬提取十六進制值

需求&#xff1a;給出一個十六進制值&#xff0c;要求提取high和low位之間的值。比如16ha0f0&#xff0c;這是一個16bit寬的十六進制數0xa0f0&#xff0c;提取[15:12]范圍內的值。 def extract_bits(value, high, low):"""從 value 中提取 [high:low] 位的值:p…

LeRobot 項目部署運行邏輯(六)——visualize_dataset_html.py/visualize_dataset.py

可視化腳本包括了兩個方法&#xff1a;遠程下載 huggingface 上的數據集和使用本地數據集 腳本主要使用兩個&#xff1a; 目前來說&#xff0c;ACT 采集訓練用的是統一時間長度的數據集&#xff0c;此外&#xff0c;這兩個腳本最大的問題在于不能裁剪&#xff0c;這也是比較好…

SSTI模版注入

1、概念 SSTI是一種常見的Web安全漏洞&#xff0c;它允許攻擊者通過注入惡意模板代碼&#xff0c;使服務器在渲染模板時執行非預期的操作。 &#xff08;1&#xff09;渲染模版 至于什么是渲染模版&#xff1a;服務器端渲染模板是一種Web開發技術&#xff0c;它允許在服務器端…

關于點膠機的精度

一、精度&#xff1a; 1:X/y軸定位精度常通在5個絲左右&#xff0c;Z軸在3個絲左右&#xff0c; 如果采用伺服電機絲桿配置&#xff0c;可提升至于個2絲左右。 2&#xff1a;膠水控制精度&#xff1a;通過噴閥驅動器&#xff0c;氣壓等參數&#xff0c;實現膠量控制&#xf…

gitee推送更新失敗問題記錄:remote: error: hook declined to update refs/heads/master

問題描述&#xff1a; gitee推送更新時&#xff0c;提示&#xff1a; 解決方法&#xff1a; 登錄Gitee&#xff0c;進入【個人主頁】 點擊【個人設置】 更改郵箱的配置&#xff0c;如下&#xff1a; 更改“禁止命令行推送暴露個人郵箱”&#xff0c;將其關閉&#xff1a;

Java如何獲取電腦分辨率?

以下是一個 Java 程序示例&#xff0c;用于獲取電腦的主屏幕分辨率&#xff1a; import java.awt.*; public class ScreenResolutionExample { public static void main(String[] args) { // 獲取默認的屏幕設備 GraphicsDevice device GraphicsEnvironm…

WPF 3D圖形編程核心技術解析

一、三維坐標系系統 WPF采用右手坐標系系統&#xff0c;空間定位遵循&#xff1a; X 軸 → 右 Y 軸 → 上 Z 軸 → 觀察方向 X軸 \rightarrow 右\quad Y軸 \rightarrow 上\quad Z軸 \rightarrow 觀察方向 X軸→右Y軸→上Z軸→觀察方向 三維坐標值表示為 ( x , y , z ) (x, y,…

【庫(Library)、包(Package)和模塊(Module)解析】

在Python中&#xff0c;**庫&#xff08;Library&#xff09;、包&#xff08;Package&#xff09;和模塊&#xff08;Module&#xff09;**是代碼組織的不同層級&#xff0c;而import語句的導入行為與它們密切相關。以下是詳細對比和解釋&#xff1a; &#x1f4e6; 1. 核心概…

裸機上的 printf:在無操作系統環境下構建 C 標準庫

在嵌入式開發和底層系統編程領域&#xff0c;裸機開發是一項極具挑戰性但又至關重要的任務。想象一下&#xff0c;在沒有操作系統支持的情況下&#xff0c;讓 C 語言的標準庫函數&#xff0c;如printf正常工作&#xff0c;這聽起來是不是很有趣又充滿挑戰&#xff1f;今天&…

基于STM32F103的智能機械臂識別與控制項目(課件PPT+源代碼)

以下是基于 STM32F103 的智能機械臂識別與控制項目的詳細介紹&#xff1a; 項目概述 該項目以 STM32F103 為核心控制器&#xff0c;結合多種傳感器和技術&#xff0c;實現了機械臂的智能識別與控制功能&#xff0c;可完成倉庫貨物的識別、搬運等任務&#xff0c;并支持多種控…

Codeforces Round 1023 (Div. 2)

Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces 一個構造問題&#xff0c;我把最大的數放在一個數組&#xff0c;其余數放在另一個數組&#xff0c;就能保證gcd不同 來看代碼&#xff1a; #include <bits/stdc.h> using namespace std;int main() {int t;ci…

6.01 Python中打開usb相機并進行顯示

本案例介紹如何打開USB相機并每隔100ms進行刷新的代碼,效果如下: 一、主要思路: 1. 打開視頻流、讀取幀 self.cam_cap = cv2.VideoCapture(0) #打開 視頻流 cam_ret, cam_frame = self.cam_cap.read() //讀取幀。 2.使用定時器,每隔100ms讀取幀 3.顯示到Qt的QLabel…

JVM——即時編譯

分層編譯模式&#xff1a;動態平衡啟動速度與執行效率 分層編譯是現代JVM&#xff08;如HotSpot、GraalVM&#xff09;實現高性能的核心策略之一&#xff0c;其核心思想是根據代碼的執行熱度動態選擇不同的編譯層次&#xff0c;實現啟動速度與運行效率的最佳平衡。以HotSpot虛…

Auto DOP:讓并行執行實現智能調優 | OceanBase 實踐

隨著數據量的迅速增長&#xff0c;企業數據庫往往面臨著一個困局&#xff1a;復雜的分析查詢需要充分的資源來保證性能&#xff0c;但過多增加并行執行又會造成資源競爭&#xff0c;影響系統穩定性。傳統基于DBA人工干預的并行度調節機制&#xff0c;既低效又難以適應動態變化的…

【區塊鏈】Uniswap之滑點(Slippage)

一、滑點是什么&#xff1f; 滑點&#xff08;Slippage&#xff09;是指你下單預期價格和最終成交價格之間的差距。 在 DEX 中&#xff0c;你的交易會影響池子的價格&#xff08;AMM機制&#xff09;&#xff0c;所以&#xff1a; 下單越大&#xff0c;滑點越大&#xff1b;…

[前端]Javascript獲取元素寬度

元素寬度屬性對比示意圖 ---------------------------------- | 外邊距&#xff08;margin&#xff09; | -------------------------------- | | 邊框&#xff08;border&#xff09; | | | -------------------------- | | | …

數字人驅動/動畫方向最新頂會期刊論文收集整理 | AAAI 2025

會議官方論文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 以下論文部分會開源代碼&#xff0c;若開源&#xff0c;會在論文原文的摘要下方給出鏈接。 語音驅動頭部動畫/其他 EchoMimic: Lifelike Audio-Driven Portrait Animations through Editabl…

Windows系統下【Celery任務隊列】python使用celery 詳解(一)

Celery 是一個基于 Python 的分布式任務隊列框架&#xff0c;它允許你在不同的進程甚至不同的服務器上異步執行任務。 特點 簡單&#xff1a;易于使用和配置&#xff0c;提供了簡潔的 API。高可用&#xff1a;支持任務的可靠交付&#xff0c;即使在出現故障時也能保證任務不丟…

移動設備常用電子屏幕類型對比

概述 LCD 家族 &#xff08;TN、STN、TFT、IPS、VA&#xff09;依賴背光&#xff0c;性能差異主要來自液晶排列和驅動方式。OLED 以自發光為核心優勢&#xff0c;但成本與壽命限制其普及。E-Paper 專為低功耗靜態顯示設計&#xff0c;與傳統屏幕技術差異顯著。 參數LCD&#…