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,原理一樣。
發(fā)布評論請先 登錄
相關(guān)推薦
在學(xué)習(xí)go語言的過程踩過的坑
C語言與Java語言的對比
OP07C輸入是0的時候,偏置電壓比datasheet上面的大很多,為什么?
用LM321對一個交流波進(jìn)行放大,出來的波形有很多高頻雜波,為什么?
為什么OPA365的帶寬要高很多但是波形如此失真?
技術(shù)干貨驛站 ▏深入理解C語言:掌握程序結(jié)構(gòu)知識

請問STVD+Cosmic有沒有自己的C語言庫?
嵌入式中C語言結(jié)構(gòu)體基本實現(xiàn)

很多薄膜電容壽命很短,這是怎么回事呢?
C語言結(jié)構(gòu)體史上最詳細(xì)的講解【軟件干貨】
求助,STM32CubeMX為什么丟失了很多組件?
嵌入式系統(tǒng)中C語言結(jié)構(gòu)體的基礎(chǔ)實現(xiàn)與應(yīng)用

C語言的指針用法

評論