吴忠躺衫网络科技有限公司

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é) 多的這一個補(bǔ)0,只是占位作用
short 剛好占2個字節(jié)
第二個char也占1個 多的這一個補(bǔ)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)推薦

    在學(xué)習(xí)go語言的過程踩過的

    作為一個5年的phper,這兩年公司和個人都在順應(yīng)技術(shù)趨勢,新項目慢慢從php轉(zhuǎn)向了go語言,從2021年到現(xiàn)在,筆者手上先后開發(fā)了兩個go項目。在學(xué)習(xí)go語言的過程中學(xué)習(xí)并總結(jié)了
    的頭像 發(fā)表于 11-11 09:22 ?201次閱讀

    C語言C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語言C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?354次閱讀

    C語言與Java語言的對比

    C語言和Java語言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨特的優(yōu)勢和特點,適用于不同的應(yīng)用場景。以下將從語法特性、內(nèi)存管理、跨平臺性、性能、應(yīng)用領(lǐng)域等多個方面對C
    的頭像 發(fā)表于 10-29 17:31 ?433次閱讀

    OP07C輸入是0的時候,偏置電壓比datasheet上面的大很多,為什么?

    根據(jù)OP07C的datasheet的第五頁,此運放的偏置電壓是典型是60uV,我使用TINA仿真的結(jié)果如下圖 發(fā)現(xiàn)輸入是0的時候,這個偏置電壓比datasheet上面的大很多???這個是為什么呢?
    發(fā)表于 09-04 08:12

    用LM321對一個交流波進(jìn)行放大,出來的波形有很多高頻雜波,為什么?

    我用LM321對一個交流波進(jìn)行放大,交流波 是以2.5V為中心的正弦波。但是出來的波形有很多高頻雜波,側(cè)過前端ACS714 的輸出,出來的波形雜波很小,,不光有雜波而且正弦波的中心被提高了,求解
    發(fā)表于 08-28 06:39

    為什么OPA365的帶寬要高很多但是波形如此失真?

    您好,最近遇到了運放電流采樣的相關(guān)問題。我按照如圖所示的電流采樣電路進(jìn)行電流采樣,,我想取得100K-200K的高頻成分同時還需要直流分量。相同的電路分別使用了兩種運放,分別是OPA376和OPA365,測試波形如圖所示。不知道為什么OPA365的帶寬要高很多但是波形
    發(fā)表于 08-02 07:44

    技術(shù)干貨驛站 ▏深入理解C語言:掌握程序結(jié)構(gòu)知識

    在計算機(jī)編程的世界中,C語言被廣泛認(rèn)可為一門強(qiáng)大而高效的編程語言,其簡潔的語法和直接的指令使得它成為了許多程序員的首選。了解C語言的程序
    的頭像 發(fā)表于 07-27 08:45 ?1538次閱讀
    技術(shù)干貨驛站 ▏深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:掌握程序<b class='flag-5'>結(jié)構(gòu)</b>知識

    請問STVD+Cosmic有沒有自己的C語言庫?

    我自己安裝的STVD+Cosmic,找不到自己的C語言庫,好多函數(shù)都不能調(diào)用,從網(wǎng)上下載的庫調(diào)用的時候會報很多錯誤,
    發(fā)表于 05-14 06:30

    嵌入式中C語言結(jié)構(gòu)體基本實現(xiàn)

    C語言中的數(shù)組只能允許程序員定義存儲相同類型數(shù)據(jù)。但是結(jié)構(gòu)C語言編程中允許您存儲不同數(shù)據(jù)類型的
    的頭像 發(fā)表于 05-11 08:49 ?1128次閱讀
    嵌入式中<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>結(jié)構(gòu)</b>體基本實現(xiàn)

    很多薄膜電容壽命很短,這是怎么回事呢?

    很多客戶在選擇薄膜電容的時候,會重視產(chǎn)品質(zhì)量,一般都會先對電容樣品進(jìn)行測試,性能沒有問題以后才會大量選用。
    的頭像 發(fā)表于 03-29 14:17 ?592次閱讀

    C語言結(jié)構(gòu)體史上最詳細(xì)的講解【軟件干貨】

    struct結(jié)構(gòu)體數(shù)據(jù)類型 前言 我們知道,在C語言中有一些基本的數(shù)據(jù)類型,如?char?int?float?long?double?string(c99) 等等數(shù)據(jù)類型,他們可以表示
    的頭像 發(fā)表于 03-28 17:52 ?853次閱讀

    求助,STM32CubeMX為什么丟失了很多組件?

    我用STM32CubeMX創(chuàng)建STM32F030C8T的工程,在設(shè)置過程中,發(fā)現(xiàn)很多設(shè)置界面和官方的教程上不太一樣,比如在設(shè)置NVIC的時候,官方的教程上是有Preemption Priority
    發(fā)表于 03-28 08:26

    嵌入式系統(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 ?556次閱讀
    嵌入式系統(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)用

    C語言的指針用法

    C語言編程中善用指針可以簡化一些任務(wù)的處理,而對于一些任務(wù)(比如動態(tài)內(nèi)存分配),必須要有指針才行的。也就是說精通C指針編程是很有必要的,幫助你成為一名優(yōu)秀的Cer。
    發(fā)表于 03-05 14:22 ?391次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的指針<b class='flag-5'>用法</b>

    C語言編程的七大陷阱與高效避指南

    在微控制器單元(MCU)開發(fā)領(lǐng)域,C語言因其接近硬件的特性、高效性和靈活性而廣泛應(yīng)用。
    的頭像 發(fā)表于 02-21 09:09 ?588次閱讀
    金莎娱乐| 成人百家乐官网的玩法技巧和规则 | 网络百家乐官网玩法| 缅甸百家乐网站是多少| bet365投注| 百家乐视频视频| 六合彩资料| 网上百家乐玩法| 京城娱乐城开户| 澳门百家乐官网官网站| 威尼斯人娱乐城 线路畅通中心| 百家乐官网有真假宝单吗| 澳门百家乐鸿运| 澳门百家乐官网心德| 百家乐技巧-百家乐开户指定代理网址 | 大玩家娱乐城开户| 百佬汇百家乐官网的玩法技巧和规则| 太阳城网上版| 大世界百家乐官网赌场娱乐网规则 | 网上百家乐哪里| 皇冠888线上投注| 网上百家乐博彩正网| 报价| 大上海百家乐的玩法技巧和规则 | 博彩百家乐字谜总汇二丹东| 百家乐官网平台在线| 大发888游戏 下载| 月华百家乐官网的玩法技巧和规则 | 百家乐官网赢家电子书| 大发888捕鱼游戏| 百家乐官网高手论| 永胜博娱乐| 百家乐投注程式| 真人百家乐官网软件博彩吧| 百家乐园能贷款吗| 金赞百家乐官网的玩法技巧和规则| 天博国际| 机械百家乐技巧| 百家乐官网23珠路打法| 真钱百家乐赌博| 百家乐赌博破解|