0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言結(jié)構(gòu)體用法很多,但是坑也很多

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-01-13 16:06 ? 次閱讀

C語言可謂是編程界的傳奇語言,歷經(jīng)幾十年,依然排名前列。 前不久還寫了一篇文章《2019年11月C語言接近Java》,說了C語言是比較受歡迎的一種語言,有望在年底超過JAVA,再次成為第一名。 本文主要說的是C語言中的結(jié)構(gòu)體,結(jié)構(gòu)體是C語言中重要的一部分內(nèi)容,也是C語言中常用的一種數(shù)據(jù)結(jié)構(gòu)。 一、關(guān)于結(jié)構(gòu)體在C語言中,結(jié)構(gòu)體(struct)指的是一種數(shù)據(jù)結(jié)構(gòu),是C語言中復(fù)合數(shù)據(jù)類型(aggregate data type)的一類。 結(jié)構(gòu)體可以被聲明為變量、指針或數(shù)組等,用以實現(xiàn)較復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。結(jié)構(gòu)體同時也是一些元素的集合,這些元素稱為結(jié)構(gòu)體的成員(member),且這些成員可以為不同的類型,成員一般用名字訪問。 結(jié)構(gòu)體的定義如下所示:

structtag{member-list}variable-list; 其中:

struct為結(jié)構(gòu)體關(guān)鍵字;

tag為結(jié)構(gòu)體的標(biāo)志;

member-list為結(jié)構(gòu)體成員列表,其必須列出其所有成員;

variable-list為此結(jié)構(gòu)體聲明的變量。

在一般情況下:tag、member-list、variable-list這3部分至少要出現(xiàn)2個。二、結(jié)構(gòu)體常規(guī)定義不同的定義,應(yīng)用在不同場景,所以,我們編程時需要結(jié)合實際情況來定義結(jié)構(gòu)體。

方法1:

定義結(jié)構(gòu)體stu,此時結(jié)構(gòu)體相當(dāng)于一個類型,比如int,如需使用此結(jié)構(gòu)體,方法同int.

struct stu{ char aa; short bb;intcc;}; struct stu stu1, stu2;

方法2:

定義結(jié)構(gòu)體stu同時定義需要使用的結(jié)構(gòu)體變量stu1, stu2。如后面再需要定義結(jié)構(gòu)體變量,方法同1.

struct stu{ char aa; short bb;intcc;}stu1, stu2; struct stu stu3;

方法3:

定義結(jié)構(gòu)體時,結(jié)構(gòu)體名稱缺省,同時定義結(jié)構(gòu)體變量stu1,stu2。但后面不可再定義結(jié)構(gòu)體變量。

struct{ char aa; short bb;intcc;}stu1, stu2;

提示:

這里不能像上面再定義結(jié)構(gòu)體變量:(以下錯誤)

structstu3;struct stu stu3;

三、使用typedef定義結(jié)構(gòu)體這里先簡單說下typedef.

在C和C++編程語言中,typedef是一個關(guān)鍵字。它用來對一個數(shù)據(jù)類型取一個別名,目的是為了使源代碼更易于閱讀和理解。它通常用于簡化聲明復(fù)雜的類型組成的結(jié)構(gòu) ,但它也常常在各種長度的整數(shù)數(shù)據(jù)類型中看到,例如size_t和time_t。 維基百科

方法4:

使用typedef定義結(jié)構(gòu)體同時,給stu結(jié)構(gòu)體別名STU,后續(xù)定義可不用使用struct stu,直接使用STU即可。

typedef struct stu{ char aa; short bb;intcc;}STU; STU stu1;

你會發(fā)現(xiàn),其實就是通過關(guān)鍵字typedef,將STU取代了struct stu。

當(dāng)然,也可以這么用:

struct stu stu1;

上面這種定義就失去了typedef的意思,所以不推薦。

方法5:

使用typedef定義結(jié)構(gòu)體時,省掉結(jié)構(gòu)體第一個別名stu,直接在后面加STU,使用方法同上。

typedef struct{ char aa; short bb; int cc;}STU; STU stu1;

方法6:

還有一種符合語法規(guī)則,但意義不大的定義方式。

typedef struct stu{ char aa; short bb; int cc;}; struct stu stu1;

以上這些定義方式算是語法的知識,如果還不懂,請再次復(fù)習(xí)一下。

四、結(jié)構(gòu)體大小計算

結(jié)構(gòu)體的大小,我相信很多人都沒搞明白。實際編程中也是很多地方都在應(yīng)用,比如:存儲、拷貝結(jié)構(gòu)體時都會牽涉到結(jié)構(gòu)體大小的問題。

1.對比兩結(jié)構(gòu)體大小,一樣嗎?

結(jié)構(gòu)體1:

struct stu{ char aa; short bb; char cc;}stu1;

結(jié)構(gòu)體2:

struct stu{ char aa; char bb; short cc;}stu2;

答案是不一樣。程序測試得出sizeof(stu1)=6, sizeof(stu2)=4. 2.分析不一樣原因

結(jié)構(gòu)體計算要遵循字節(jié)對齊原則,一般滿足三個準(zhǔn)則:

1)結(jié)構(gòu)體變量的首地址能夠被其最寬基本類型成員的大小所整除;

2)結(jié)構(gòu)體每個成員相對于結(jié)構(gòu)體首地址的偏移量(offset)都是成員大小的整數(shù)倍,如有需要編譯器會在成員之間加上填充字節(jié);

3)結(jié)構(gòu)體的總大小為結(jié)構(gòu)體最寬基本類型成員大小的整數(shù)倍,如有需要編譯器會在最末一個成員之后加上填充字節(jié);

對于上面結(jié)構(gòu)體stu1來說,最大字節(jié):2字節(jié),順序是 char->short->char:

2個字節(jié)

第一個char占一個字節(jié) 多的這一個補0,只是占位作用
short 剛好占2個字節(jié)
第二個char也占1個 多的這一個補0


對于上面結(jié)構(gòu)體stu2來說,最大字節(jié):2字節(jié),順序是 char->char->short:

第一個char占一個字節(jié) 第二個char占一個字節(jié)
short 剛好占2個字節(jié)

通過上面兩個表格,相信你應(yīng)該明白了,改成4字節(jié)的int,原理一樣。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式系統(tǒng)中C語言結(jié)構(gòu)體的基礎(chǔ)實現(xiàn)與應(yīng)用

    C語言中的數(shù)組只能允許程序員定義存儲相同類型數(shù)據(jù)。但是結(jié)構(gòu)C語言編程中允許您存儲不同數(shù)據(jù)類型的
    發(fā)表于 03-12 14:29 ?321次閱讀
    嵌入式系統(tǒng)中<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結(jié)構(gòu)</b>體的基礎(chǔ)實現(xiàn)與應(yīng)用

    vb語言c++語言的區(qū)別

    Microsoft開發(fā)的一種面向?qū)ο蟮氖录?qū)動編程語言。它的設(shè)計目標(biāo)是簡化編程過程,讓初學(xué)者能快速上手。與之相比,C++語言是一種通用的、面向?qū)ο蟮木幊?/div>
    的頭像 發(fā)表于 02-01 10:20 ?1523次閱讀

    C語言-#和##的具體用法

    C語言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定義的替換的過程中,#號可以作為一個預(yù)處理運算符,把宏參數(shù)轉(zhuǎn)換為字符串。##運算符則可以把兩個宏參數(shù)組合在一起。下面就來說說具體的用法
    的頭像 發(fā)表于 12-19 12:54 ?3305次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>-#和##的具<b class='flag-5'>體用法</b>

    嵌入式工程師C語言小技巧

    軟件界看起來不怎么高大上,但是 MCU 的開發(fā)目前 C 語言還是主流,為了更好的操控和調(diào)試我們的硬件,我們還是需要竭力的避免一些 C語言編程
    的頭像 發(fā)表于 12-13 11:32 ?389次閱讀

    PLC光分路器的分類和具體用法

    PLC光分路器的分類和具體用法? PLC(Planar Lightwave Circuit,平面光波導(dǎo)電路)光分路器是一種集成光學(xué)器件,用于在光通信、光網(wǎng)絡(luò)、傳感器和光學(xué)測試等領(lǐng)域中實現(xiàn)光信號的分配
    的頭像 發(fā)表于 11-28 15:50 ?911次閱讀

    嵌入式C語言結(jié)構(gòu)特點

    過程中,不論是基于寄存器開發(fā)還是基于庫開發(fā),深入理解和掌握嵌入式C語言的函數(shù)、指針、結(jié)構(gòu)體是學(xué)習(xí)STM32的關(guān)鍵。嵌入式C語言
    的頭像 發(fā)表于 11-24 16:16 ?523次閱讀
    嵌入式<b class='flag-5'>C</b><b class='flag-5'>語言</b>的<b class='flag-5'>結(jié)構(gòu)</b>特點

    C語言printf函數(shù)族學(xué)習(xí)筆記

    printf 應(yīng)該是學(xué)習(xí)C語言的第一個函數(shù),我們都知道它是用于字符串格式化輸出的。但是它的用法你真正了解了嗎?
    的頭像 發(fā)表于 11-24 11:15 ?775次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>printf函數(shù)族學(xué)習(xí)筆記

    c語言中順序結(jié)構(gòu)的基本流程

    C語言是一種通用的編程語言,注重結(jié)構(gòu)化編程和順序結(jié)構(gòu)。順序結(jié)構(gòu)
    的頭像 發(fā)表于 11-22 10:20 ?781次閱讀

    c語言在while中嵌套if循環(huán)

    中嵌套if語句的用法和好處。 一、C語言中的while循環(huán)和if語句 在開始我們深入探討while循環(huán)中嵌套if語句的細(xì)節(jié)之前,讓我們首先回顧一下while循環(huán)和if語句的基本用法。
    的頭像 發(fā)表于 11-22 10:09 ?3660次閱讀

    C語言for循環(huán)的用法和注意事項

    C 語言是一種廣泛使用的編程語言,它具有簡潔、高效、靈活的特點。C 語言中有很多控制流程的語句,
    的頭像 發(fā)表于 11-20 18:27 ?1690次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>for循環(huán)的<b class='flag-5'>用法</b>和注意事項

    淺談C語言面向?qū)ο缶幊趟枷?/a>

    C語言是一種面向過程的語言,但是可以用結(jié)構(gòu)體和函數(shù)指針來模擬面向?qū)ο蟮奶匦裕热绶庋b、繼承和多
    發(fā)表于 11-02 12:27 ?795次閱讀

    C語言循環(huán)結(jié)構(gòu)的使用方法

    詳細(xì)介紹了C語言while循環(huán)結(jié)構(gòu)、do-while循環(huán)結(jié)構(gòu)、for循環(huán)結(jié)構(gòu)、循環(huán)退出語句的語法和使用方法。
    發(fā)表于 11-02 11:26 ?1141次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>循環(huán)<b class='flag-5'>結(jié)構(gòu)</b>的使用方法

    MCS51匯編中的DATA是偽指令嗎?具體用法是什么?

    MCS51匯編中的DATA是偽指令嗎?具體用法是什么?
    發(fā)表于 11-02 08:17

    什么是__attribute__?嵌入式C代碼屬性怎么定義?

    嵌入式開發(fā),離不開 C 語言C語言中有很多語法會直接或間接影響你代碼的質(zhì)量,下面就來講講__attribute__ 關(guān)鍵字的
    的頭像 發(fā)表于 10-13 15:55 ?4462次閱讀
    什么是__attribute__?嵌入式<b class='flag-5'>C</b>代碼屬性怎么定義?

    C語言結(jié)構(gòu)體講解

    C語言中有一塊極容易被忽略,但是對于嵌入式編程來說用處特別大的內(nèi)容——結(jié)構(gòu)
    發(fā)表于 10-01 13:27 ?291次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結(jié)構(gòu)</b>體講解