C語言結構體常見寫法及用法

2021-02-19 嵌入式專欄

關注+星標公眾,不錯過精彩內容

作者 | strongerHuang

微信公眾號 | 嵌入式專欄

C語言可謂是編程界的傳奇語言,歷經幾十年,依然遙遙領先。從去年底開始,C語言就開始位居 TIOBE程式語言排行榜首位,一年過去了,C語言從未被超越,反而JAVA在前不久被python超越了。

2020-11 TIOBE程式語言排行榜

本文主要說的是C語言中的結構體,結構體是C語言中重要的一部分內容,也是C語言中常用的一種數據結構。

在C語言中,結構體(struct)指的是一種數據結構,是C語言中複合數據類型(aggregate data type)的一類。

結構體可以被聲明為變量、指針或數組等,用以實現較複雜的數據結構。結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的類型。
 struct tag { member-list } variable-list; 

member-list為結構體成員列表,其必須列出其所有成員;在一般情況下:tag、member-list、variable-list這3部分至少要出現2個。

不同的定義,應用在不同場景,所以,我們編程時需要結合實際情況來定義結構體。

方法1:

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

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

方法2:

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

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

方法3:

定義結構體時,結構體名稱預設,同時定義結構體變量stu1,stu2。但後面不可再定義結構體變量。

struct{    char  aa;    short bb;    int   cc;}stu1, stu2;

提示:

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

struct stu3; struct stu stu3;

這裡先簡單說下typedef:

在C和C++程式語言中,typedef是一個關鍵字。它用來對一個數據類型取一個別名,目的是為了使原始碼更易於閱讀和理解。它通常用於簡化聲明複雜的類型組成的結構 ,但它也常常在各種長度的整數數據類型中看到,例如size_t和time_t。

方法4:

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

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

你會發現,其實就是通過關鍵字typedef,將STU取代了struct stu。

當然,也可以這麼用:

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

方法5:

使用typedef定義結構體時,省掉結構體第一個別名stu,直接在後面加STU,使用方法同上。

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

方法6:

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

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.

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

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

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

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

對於上面結構體stu1來說,最大字節:2位元組,順序是 char->short->char: 

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

對於上面結構體stu2來說,最大字節:2位元組,順序是 char->char->short: 

第一個char佔一個字節第二個char佔一個字節short 剛好佔2個字節

通過上面兩個表格,相信你應該明白了,改成4位元組的int,原理一樣。

最後,強調一下,學習編程,不能只看書,要多敲代碼。

-- END --

關注微信公眾號『嵌入式專欄』,底部菜單查看更多內容,回復「加群」按規則加入技術交流群。

點擊「閱讀原文」查看更多分享,歡迎點分享、收藏、點讚、在看

相關焦點

  • 剖析c語言結構體的高級用法(二)
    昨天分享了結構體裡面的一些常見用法(因為測試代碼測試的有點晚,有些地方沒有分享完。),今天我們來繼續分享結構體裡面的其他用法。
  • C語言編程 — 結構體與位域
    數組類型顯然無法滿足這一需求,此時可以使用結構體(Struct)來存放一組不同類型的數據。C 語言中,像 int、float、char 等是由 C 語言本身提供的數據類型,不能再進行分拆,我們稱之為基本數據類型。
  • C語言結構體常見方法
    把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變量了——至少我現在沒掌握這種方法。struct B{               int c;          }          b;  }  a;  //使用如下方式訪問:  a.b.c = 10;   特別的,可以一邊定義結構體B,一邊就使用上:[cpp] view plain copy 在CODE
  • C語言中的結構體和聯合體
    C語言實現面向對象的原理在 C 語言中,結構體(struct)是一個或多個變量的集合,這些變量可能為不同的類型,為了處理的方便而將這些變量組織在一個名字之下。簡單地說,我們可以把「結構體類型」和「結構體變量」理解為是面向對象語言中「類」和「對象」的概念。此外,結構體裡的成員也可以是一個結構體變量。
  • C語言結構體、枚舉以及位域的講解
    【置頂】一個好玩的小遊戲(純C語言編寫)【置頂】如果是初學C語言請看完,如何學好C語言絕對精品【必讀】乾貨丨程式設計師必定會愛上的十款軟體【必讀】10分鐘,快速掌握C語言指針【必讀】8個基礎且實用的C語言經典實例【附源碼】【必讀】C語言實現圖書管理系統源碼,已驗證可以直接運行【必讀】
  • C語言結構體(struct)常見使用方法
    ; 把結構體名稱去掉,這樣更簡潔,不過也不能定義其他同結構體變量了——至少我現在沒掌握這種方法。B{ int c; }b; struct B sb; }a; 使用方法與測試:[cpp] a.b.c = 11;
  • C 語言中的結構體和共用體(聯合體)
    今天,我們來介紹一下 C 語言中結構體和共用體的相關概念和使用。C 語言為了使用方便和直觀,定義可以把 (*p).num 改用 p->num 來代替,它表示 p 所指向的結構體變量中的 num 成員。
  • C語言中的結構體和共用體(聯合體)
    今天,我們來介紹一下 C 語言中結構體和共用體的相關概念和使用。簡單地說,我們可以把「結構體類型」和「結構體變量」理解為是面向對象語言中「類」和「對象」的概念。此外,結構體裡的成員也可以是一個結構體變量。
  • C語言結構體(Struct)
    在C語言中,可以使用結構體(Struct)來存放一組不同類型的數據。結構體的定義形式為:struct 結構體名{    結構體所包含的變量或數組};結構體是一種集合,它裡面包含了多個變量或數組,它們的類型可以相同,也可以不同,每個這樣的變量或數組都稱為結構體的成員(Member)。
  • C語言結構體(struct)最全的講解(萬字乾貨)
    在C語言中,可以定義結構體類型,將多個相關的變量包裝成為一個整體使用。在結構體中的變量,可以是相同、部分相同,或完全不同的數據類型。在C語言中,結構體不能包含函數。在面向對象的程序設計中,對象具有狀態(屬性)和行為,狀態保存在成員變量中,行為通過成員方法(函數)來實現。C語言中的結構體只能描述一個對象的狀態,不能描述一個對象的行為。
  • C語言結構體(struct)詳解
    //對於「一錘子買賣」,只對最終的結構體變量感興趣,其中A、B也可刪,不過最好帶著  2. struct A{   3.         struct B{  4.              int c;  5.         }  6.
  • C語言之結構體(struct)
    long、unsigned int 、short、char (相當於各種文件類型,比如 .txt、.c、.h)這些關鍵字是否很熟悉?這都是 C 語言定義好的數據類型,直接拿來用就行了。但是我想自定義一個別的類型的數據怎麼辦?就靠 struct 了。
  • ...也可以面向對象面層,使用「函數指針結構體」為C語言找個「對象」
    函數指針結構體稍微思考一下,應該能夠想到C語言中的普通數據類型不僅可以用於定義數組,還可以用來定義結構體,例如:struct cn{char c;int i;double d;};那麼可以看作「普通數據類型」的函數指針也可以定義結構體嗎?
  • C語言之結構體最全面總結
    定義我們剛剛申請了一個名叫Info的結構體類型,那麼理論上我們可以像聲明其他變量的操作一樣,去聲明我們的結構體操作,但是C語言中規定,聲明結構體變量的時候,struct關鍵字是不可少的。學號:20191102姓名:Joy入學時間:2019/9/8學制:5畢業時間:2024傳遞指向結構體變量的指針早期的C語言是不允許直接將結構體作為參數直接傳遞進去的。主要是考慮到如果結構體的內存佔用太大,那麼整個程序的內存開銷就會爆炸。不過現在的C語言已經放開了這方面的限制。
  • C語言系列(九):結構體
    這就需要一種新的數據類型,能夠將具有內在聯繫的不同類型的數據組成一個整體,在C語言中,這種數據類型就是結構體。在C語言中,結構體屬於構造數據類型,它由若干成員組成,成員的類型既可以是基本數據類型,也可以是構造數據類型,而且可以互不相同。struct 結構體類型名{ 類型1 成員名1; 類型2 成員名2; ...
  • 為什麼C語言中的結構體的size,並不等於它所有成員size之和?
    結構體在C語言程序開發中,是不可或缺的語法。不過,相信不少C語言初學者遇到過這樣的問題:為什麼結構體的 size 有時不等於它的所有成員的 size 之和呢?為什麼結構體的 size 有時不等於它的所C語言結構體大小等於它的所有成員大小之和嗎?
  • 指向結構體的指針
    在C語言中幾乎可以創建指向任何類型的指針,包括用戶自定義的類型。創建結構體指針是極常見的。*r是一個結構體,像任何其他Rec類型的結構體一樣。下面的代碼顯示了這個指針變量的典型用法:strcpy((*r).name, "Leigh");strcpy((*r).city, "Raleigh");strcpy((*r).state, "NC");printf("%sn", (*r).city);free(r);您可以像對待一個普通結構體變量那樣對待*r,但在遇到C的操作符優先級問題時要小心
  • C語言中的運算符
    一、前言在嵌入式開發中,我們一般選用C語言作為開發語言。一個主要的原因在於C語言提供了大量的運算符,比如我們對硬體的操作一般涉及到對位的操作,而C語言就提供了這樣的運算符,這是其他語言不具備的。二、C語言運算符有哪些C語言有大量的運算符,可大致分為以下幾類:括號與結構體符號、單目、算術、移位、關係、位、邏輯、三目、賦值、逗號。括號與結構體符號:括號包括()、[],結構體符號指的是結構體成員引用時的符號「->」、「.」
  • C語言結構體變量
    為了解決這樣的問題,就要用到結構體這種構造類型,我們可以將每個學生的各項信息以不同類型的數據存放到一個結構體中,如用字符型表示姓名,用整型或字符型表示學號、用整型或實型表示成績。結構體變量的定義結構體就是將不同類型的數據組合成一個有機的整體,以便於引用。
  • C語言strcmp和strcpy的用法
    一、c語言strcmp()用法原型:int strcmp(const char *s1, const char *s2);頭文件:#include