C語言可謂是編程界的傳奇語言,歷經幾十年,依然排名前列,
本文主要說的是C語言中的結構體,結構體是C語言中重要的一部分內容,也是C語言中常用的一種資料結構,
一、關于結構體
在C語言中,結構體(struct)指的是一種資料結構,是C語言中復合資料型別(aggregate data type)的一類,
結構體可以被宣告為變數、指標或陣列等,用以實作較復雜的資料結構,結構體同時也是一些元素的集合,這些元素稱為結構體的成員(member),且這些成員可以為不同的型別,成員一般用名字訪問,
結構體的定義如下所示:
struct tag { member-list } variable-list;
其中:
? struct為結構體關鍵字;
? tag為結構體的標志;
? member-list為結構體成員串列,其必須列出其所有成員;
? variable-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定義結構體
這里先簡單說下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,
當然,也可以這么用:
struct stu stu1;
上面這種定義就失去了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.
2.分析不一樣原因
結構體計算要遵循位元組對齊原則,一般滿足三個準則:
1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對于結構體首地址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末一個成員之后加上填充位元組;
對于上面結構體stu1來說,最大位元組:2位元組,順序是 char-short-char:
2個位元組

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

通過上面兩個表格,相信你應該明白了,改成4位元組的int,原理一樣,
最后,強調一下,學習編程,不能只看書,要多敲代碼,

如果你想深度學習C語言以及高級編程——編程俱樂部【點擊進入】!
涉及到:C語言、C++、windows編程、網路編程、QT界面開發、Linux編程、游戲編程、黑客等等......

程式員編程入門資料:

程式員?推薦學習書籍:

一個活躍、高逼格、高層次的程式員編程學習殿堂;編程入門只是順帶,思維的提高才有價值!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195896.html
標籤:C
