1 結(jié)構(gòu)聲明結(jié)構(gòu)聲明描述了一個(gè)結(jié)構(gòu)的組織布局。舉例如下:
struct tempA
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
};
下邊依次對(duì)此結(jié)構(gòu)進(jìn)行解析:
1、struct
struct 是一個(gè)關(guān)鍵字,表明跟在其后的是一個(gè)結(jié)構(gòu);
2、tempA
tempA 是一個(gè) 可選的標(biāo)記 ,但是在上述例子中,不能去掉,否則該結(jié)構(gòu)沒有作用的 “對(duì)象” ,不過可寫成如下樣式:
struct
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
}tempB;
tempA 這個(gè)標(biāo)記,寫與不寫,主要有以下區(qū)別:
1、寫了此標(biāo)記,則可以在后續(xù)程序中使用此標(biāo)記來引用該結(jié)構(gòu);
struct tempA book; // C 寫法// C++允許在聲明結(jié)構(gòu)變量時(shí),省略關(guān)鍵字struct
tempA book; // C++ 寫法
2、如果不寫此標(biāo)記,則只引用該結(jié)構(gòu)定義了一個(gè)變量,也就是一次性的,如果需要定義另外一個(gè)擁有相同元素的結(jié)構(gòu)體變量,必須要全部重新再寫一遍,不能直接引用 tempB 。
2 定義結(jié)構(gòu)變量結(jié)構(gòu)有兩層含義,一層是 “結(jié)構(gòu)布局” ,就是上邊的結(jié)構(gòu)聲明。結(jié)構(gòu)布局告訴編譯器如何表示數(shù)據(jù),但是它并未讓編譯器為數(shù)據(jù)分配空間(待確認(rèn),看參考的經(jīng)驗(yàn),利用 sizeof 還是有空間的)。
下一步是創(chuàng)建一個(gè)結(jié)構(gòu)變量, 即是結(jié)構(gòu)的另外一層含義,前邊也有提到過,程序中實(shí)現(xiàn)如下:
struct tempA book; // C 寫法
tempA book; // C++ 寫法
但是如果打算多次使用此結(jié)構(gòu),就要使用帶標(biāo)記的形式,也就是必須要寫 tempA ;或使用 typedef ,下邊將講一下 typedef 的用法。
3 typedef個(gè)人建議使用 typedef 時(shí),把標(biāo)記也寫上,這樣在 C 中,可以使用 typedef 定義的類型(tempB),在 C++ 中可以直接使用標(biāo)記(tempA)。兩個(gè)名字應(yīng)該是不能一樣的。
typedef struct tempA
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
}tempB;
使用 typedef 的好處有如下兩點(diǎn):
1、為經(jīng)常出現(xiàn)的類型創(chuàng)建一個(gè)方便,易識(shí)別的類型名。
2、typedef 常用于給復(fù)雜的類型命名。
4 常見方法舉例4.1 未用typedef先聲明結(jié)構(gòu)體類型,再定義結(jié)構(gòu)變量
struct tempA
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
};
struct tempA book; // C 寫法
tempA book; // C++ 寫法
在聲明類型的同時(shí),定義結(jié)構(gòu)變量
struct tempA
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
}book;
直接定義結(jié)構(gòu)體類型變量(沒有標(biāo)記)
struct
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
}book;
4.2 使用typedef直接定義結(jié)構(gòu)體變量,沒有標(biāo)記,但是可以使用此變量引用該結(jié)構(gòu)體
typedef struct
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
}tempB;
tempB book; // C C++ 均可
推薦此方法,即定義標(biāo)記,又定義結(jié)構(gòu)體變量
typedef struct tempA
{
char cvariableA; // char 類型的變量 cvariableA
int ivariableB; // int 類型的變量 ivariableB
float fvariableC; // float 類型的變量 fvariableC
char carrayA; // char 類型的數(shù)組 carrayA
}tempB;
此時(shí)如果使用 C ,則可以使用 tempB ;如果使用 C++ ,則可以使用 tempA 或 tempB 。
5 總結(jié)除了上邊講的,還有一些其他的結(jié)構(gòu)體初始化,結(jié)構(gòu)體里邊定義結(jié)構(gòu)體等內(nèi)容。但萬變不離其宗,都可以參考文章開頭的網(wǎng)址,里邊講的比較詳細(xì)。這里只是簡(jiǎn)單做個(gè)總結(jié)。
后續(xù)我也會(huì)按文中推薦的標(biāo)準(zhǔn)來使用(用 typedef ,標(biāo)記和結(jié)構(gòu)變量都要),這樣兼容性比較好,也使自己的代碼有比較統(tǒng)一的風(fēng)格。
編輯:jq
-
程序
+關(guān)注
關(guān)注
117文章
3791瀏覽量
81153 -
C++
+關(guān)注
關(guān)注
22文章
2110瀏覽量
73703
原文標(biāo)題:C/C++ 結(jié)構(gòu)體定義及使用
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論