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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

C語言結構體用法很多,但是坑也很多

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

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

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

struct為結構體關鍵字;

tag為結構體的標志;

member-list為結構體成員列表,其必須列出其所有成員;

variable-list為此結構體聲明的變量。

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

方法1:

定義結構體stu,此時結構體相當于一個類型,比如int,如需使用此結構體,方法同int.

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

方法2:

定義結構體stu同時定義需要使用的結構體變量stu1, stu2。如后面再需要定義結構體變量,方法同1.

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

方法3:

定義結構體時,結構體名稱缺省,同時定義結構體變量stu1,stu2。但后面不可再定義結構體變量。

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

提示:

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

structstu3;struct stu stu3;

三、使用typedef定義結構體這里先簡單說下typedef.

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

方法4:

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

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

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

當然,也可以這么用:

struct stu stu1;

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

方法5:

使用typedef定義結構體時,省掉結構體第一個別名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;

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

四、結構體大小計算

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

1.對比兩結構體大小,一樣嗎?

結構體1:

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

結構體2:

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

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

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

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

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

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

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

2個字節(jié)

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


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

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

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

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

    評論

    相關推薦

    在學習go語言的過程踩過的

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

    C語言C++中結構體的區(qū)別

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

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

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

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

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

    技術干貨驛站 ▏深入理解C語言:掌握程序結構知識

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

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

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

    嵌入式中C語言結構體基本實現(xiàn)

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

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

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

    C語言結構體史上最詳細的講解【軟件干貨】

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

    嵌入式系統(tǒng)中C語言結構體的基礎實現(xiàn)與應用

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

    C語言的指針用法

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

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

    在微控制器單元(MCU)開發(fā)領域,C語言因其接近硬件的特性、高效性和靈活性而廣泛應用。
    的頭像 發(fā)表于 02-21 09:09 ?541次閱讀

    plc編程語言c語言的聯(lián)系 c語言和PLC有什么區(qū)別

    語言,主要用于開發(fā)各種應用程序。盡管PLC編程語言C語言有一些相似之處,但它們之間存在一些明顯的區(qū)別。 首先,PLC編程
    的頭像 發(fā)表于 02-05 14:21 ?4209次閱讀

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

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

    如何解決C語言中的“訪問權限沖突”異常?C語言引發(fā)異常原因分析

    如何解決C語言中的“訪問權限沖突”異常?C語言引發(fā)異常原因分析? 在C語言中,訪問權限沖突異常通
    的頭像 發(fā)表于 01-12 16:03 ?5859次閱讀