關注+星標公眾號,不錯過精彩內容
作者 | 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 --
關注微信公眾號『嵌入式專欄』,底部菜單查看更多內容,回復「加群」按規則加入技術交流群。點擊「閱讀原文」查看更多分享,歡迎點分享、收藏、點讚、在看。