結(jié)構(gòu)體詳解
結(jié)構(gòu)體基本用法:
結(jié)構(gòu)體就是把相同或者不同類型的便利放到一起,這和C++中的類很像,但沒(méi)有c++那么復(fù)雜,C語(yǔ)言中的結(jié)構(gòu)體申明如下:
struct student //結(jié)構(gòu)體名
{
char name[10]; //姓名
int number; //編號(hào)
int grade; //成績(jī)
};
申明很簡(jiǎn)單,其內(nèi)存是按順序放置的。
下面需要注意的幾點(diǎn):
1.申明時(shí)不能初始化(為什么后面會(huì)講)
2.申明只是申明一個(gè)結(jié)構(gòu)體,是不能使用的
3.獲取結(jié)構(gòu)體大小可以用sizeof(struct student)
4.結(jié)構(gòu)體可以嵌套定義
5.結(jié)構(gòu)體大小必須是所有成員變量大小的整數(shù)倍
一般我們會(huì)使用新定義類型來(lái)代替結(jié)構(gòu)體,其實(shí)就是給結(jié)構(gòu)體起一個(gè)新的名字
typedef struct student
{
char name[10];
int number;
int grade;
}STU;
STU stu1={"張三",001,95};//定義一個(gè)stu1結(jié)構(gòu)體變量,并進(jìn)行初始化
注意:只有在定義的時(shí)候才能一起初始化,一旦定義了之后,不能一起初始化,但是可以分別初始化,為啥之后不能初始化,主要原因是因?yàn)榻Y(jié)構(gòu)體變量是按順序存儲(chǔ)的。
這樣STU表示的實(shí)際就是結(jié)構(gòu)體,具體可以參考typedef用法。
結(jié)構(gòu)體既然申明了那怎么使用了,這里我們必須定義一個(gè)結(jié)構(gòu)體變量,注意是結(jié)構(gòu)體變量,也就是定義一個(gè)變量,這里的變量的類型是結(jié)構(gòu)體,因此結(jié)構(gòu)體申明部分其實(shí)就是申明一個(gè)新的變量類型,因此結(jié)構(gòu)體是一個(gè)類型,不是變量,所以這也就是為啥申明的時(shí)候里面不能進(jìn)行初始化的原因。 下面舉個(gè)例子來(lái)使用結(jié)構(gòu)體:
我們引用結(jié)構(gòu)體是可以這樣引用:
stu1.name="李四";
stu1.number=002;
stu1.grade=100;
上面的引用方式是成員引用,也就是普通變量方式引用,還有一種引用就是結(jié)構(gòu)體指針引用,這兩種引用的方式有很大不同,后面會(huì)講到。
指針引用時(shí)必須申明一個(gè)結(jié)構(gòu)體指針,就像在整型變量中使用指針一樣,我們需要先定義一個(gè)整型指針變量,然后使用它,這里也是一樣。
STU *stu2; //定義一個(gè)stu2結(jié)構(gòu)體指針變量
上面不能進(jìn)行初始化,因?yàn)槠鋵?shí)質(zhì)是一個(gè)指針,不能像變量一樣可以一起初始化(當(dāng)然,指針實(shí)質(zhì)還是變量,但是其使用不一樣,所以一般說(shuō)指針還是指指針變量)
既然是指針,那么必須指向一個(gè)內(nèi)存地址,因此指針變量使用之前必須指向一塊特定的內(nèi)存地址,結(jié)構(gòu)體指針也不例外。 那我們?cè)鯓映跏蓟Y(jié)構(gòu)體指針呢
第一種方式用動(dòng)態(tài)分配內(nèi)存的方式:
stu2=(STU*)malloc(STU);
第二種方式使用結(jié)構(gòu)體變量間接方式:
stu2=&stu1;
這樣結(jié)構(gòu)體stu2指向的就是stu1的首地址。
結(jié)構(gòu)體高級(jí)用法:
在函數(shù)中,如果參數(shù)是結(jié)構(gòu)體,那么又該怎樣使用呢,其實(shí)我們使用結(jié)構(gòu)體和使用變量是一樣的,定義如下
void swap(STU stu1,STU stu2)
{
int exchange=0;
exchange = stu1.grade;
stu1.grade=stu2.grade;
stu2.grade=exchange;
/******
......
******/
}
這樣就可以使用結(jié)構(gòu)體變量了,但是請(qǐng)思考下面代碼結(jié)果:
STU stu3={"王五",003,80};
swap(stu1,stu3);
執(zhí)行這個(gè)函數(shù)兩個(gè)結(jié)構(gòu)體中的grade會(huì)交換么? 結(jié)果是不會(huì)。 這里就和函數(shù)中講解的是一樣的,那么我們?cè)趺床拍軐⑵浣粨Q呢,在普通函數(shù)中給的方法是使用指針,因此這里我們同樣可以使用指針來(lái)操作,我們必須將函數(shù)的形參定義為結(jié)構(gòu)體指針變量。 如下:
STU swap(STU *stu1,STU *stu2)
{
int exchange=0;
exchange = stu1->grade;
stu1->grade=stu2->grade;
stu2->grade=exchange;
}
這樣我們使用
swap(&stu1,&stu3);
就可以將其調(diào)換位置了
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7614瀏覽量
137268 -
C++
+關(guān)注
關(guān)注
22文章
2113瀏覽量
73747 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28429 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10860
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論