頭文件的結構體的定義為:
typedef struct
{
u8bmRequestType;
u8bRequest;
u16wValue;
u16wIndex;
u16wLength;
}USB_Request_Header_t;
雖然粉絲最后都理解了,但是仍想趁著這個機會整理一下結構體的用法,希望能夠對剛入行的童鞋們有所幫助。
結構體
在實際的開發過程中,一組數據往往具有不同的數據類型,此時數組是不能夠滿足需求了。因為數組中各元素的類型必須是一致的。為了解決這個需求,C中給出了另一種數據類型-結構體
,每一個成員可以是任意一種數據類型。
定義一個結構體的類型為:
struct
結構名{
成員列表
};
其中struct后面的叫做結構體名
,而struct 結構名
叫做結構體類型,只有結構體類型才可以定義變量,結構體名是不能定義變量的。注意}
后面是需要加;
的。
struct
stu
{XXX};
stustu1;
//fail
struct stu
stu1
;
//true
三種結構體類型變量說明
結構變量有以下三種方式:
1、先定義結構,再定義結構變量
struct stu
{
int age;
};
struct stu stu1;
//定義了變量stu1
2、定義結構體類型的同時說明變量
struct
stu
{
int
age;
}stu1;
3、直接說明結構變量
struct
{
int
age;
}stu1;
這種方法和第一種方法相比,就是省略了結構體名
,而省略的結構體名,就無法組合結構體類型了,而無這種結構體類型,自然就不能再定義這種結構體類型的變量了。
這種結構體也被稱為匿名結構體,即沒有結構體名。匿名結構體通常作為結構體成員的一個變量去使用。如下:
struct
stu
{
int
age;
struct
{
int
month;
}birthday;
}stu1;
sut1.birthday.month=
10
;
//用法
結構體成員表示方法
struct
stu
stu1
,*
pstu1
;
pstu1=&stu1;
stu1.age=
10
;
//true
(&stu1)->age=
10
;
//true
pstu1->age=
10
;
//true
(*pstu1).age=
10
;
//true
*pstu1.age=
10
;
//fail
如果對變量訪問成員,則使用.
運算符,如果是對指針訪問成員則使用->
運算符。
上例中除了最后一個都是對的。因為.
運算符的優先級高于*
,所以會先執行pstu1.age
,而pstu1是一個指針,不可以使用.
運算符去訪問,需要正確使用->
運算符訪問。所以最終會報錯。
結構體指針做參數
struct
stu
stu1
;
void
fun
(structstu*val);
fun(&stu1);
在這里也有新手誤解的地方,在函數入參這一塊,傳入的是一個指針,并不是說外部一定要先定義一個指針變量struct stu *xxx
,然后把xxx
傳進去。就像下面一樣。
struct
stu
stu1
;
struct
stu
*
p_stu1
=&
stu1
;
fun(p_stu1);
結構體初始化
定義變量的同時初始化
struct
stu
{
int
age;
}stu1={
18
};
先定義在初始化
struct
stu
stu1
,
stu2
;
stu1.age=
18
;
stu2=stu1;
//結構體之間可以直接賦值
常用初始化
在開發過程中,一個結構體之間會存在若干成員,極其復雜。這個時候通常是將成員全部清零,然后再對需要的成員進行構造。
struct
stu
stu1
;
memset
(&stu1,
0
,
sizeof
(stu1));
XXX_Init(&stu1.xxx);
-
指針
+關注
關注
1文章
480瀏覽量
70513 -
結構體
+關注
關注
1文章
130瀏覽量
10835
發布評論請先 登錄
相關推薦
評論