結(jié)構(gòu)體詳解
結(jié)構(gòu)體基本用法:
結(jié)構(gòu)體就是把相同或者不同類型的便利放到一起,這和C++中的類很像,但沒有c++那么復(fù)雜,C語言中的結(jié)構(gòu)體申明如下:
struct student //結(jié)構(gòu)體名
{
char name[10]; //姓名
int number; //編號
int grade; //成績
};
申明很簡單,其內(nèi)存是按順序放置的。
下面需要注意的幾點(diǎn):
1.申明時(shí)不能初始化(為什么后面會講)
2.申明只是申明一個(gè)結(jié)構(gòu)體,是不能使用的
3.獲取結(jié)構(gòu)體大小可以用sizeof(struct student)
4.結(jié)構(gòu)體可以嵌套定義
5.結(jié)構(gòu)體大小必須是所有成員變量大小的整數(shù)倍
一般我們會使用新定義類型來代替結(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)體變量是按順序存儲的。
這樣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è)例子來使用結(jié)構(gòu)體:
我們引用結(jié)構(gòu)體是可以這樣引用:
stu1.name="李四";
stu1.number=002;
stu1.grade=100;
上面的引用方式是成員引用,也就是普通變量方式引用,還有一種引用就是結(jié)構(gòu)體指針引用,這兩種引用的方式有很大不同,后面會講到。
指針引用時(shí)必須申明一個(gè)結(jié)構(gòu)體指針,就像在整型變量中使用指針一樣,我們需要先定義一個(gè)整型指針變量,然后使用它,這里也是一樣。
STU *stu2; //定義一個(gè)stu2結(jié)構(gòu)體指針變量
上面不能進(jìn)行初始化,因?yàn)槠鋵?shí)質(zhì)是一個(gè)指針,不能像變量一樣可以一起初始化(當(dāng)然,指針實(shí)質(zhì)還是變量,但是其使用不一樣,所以一般說指針還是指指針變量)
既然是指針,那么必須指向一個(gè)內(nèi)存地址,因此指針變量使用之前必須指向一塊特定的內(nèi)存地址,結(jié)構(gòu)體指針也不例外。 那我們怎樣初始化結(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)體高級用法:
在函數(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)體變量了,但是請思考下面代碼結(jié)果:
STU stu3={"王五",003,80};
swap(stu1,stu3);
執(zhí)行這個(gè)函數(shù)兩個(gè)結(jié)構(gòu)體中的grade會交換么? 結(jié)果是不會。 這里就和函數(shù)中講解的是一樣的,那么我們怎么才能將其交換呢,在普通函數(shù)中給的方法是使用指針,因此這里我們同樣可以使用指針來操作,我們必須將函數(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語言
+關(guān)注
關(guān)注
180文章
7616瀏覽量
137887 -
C++
+關(guān)注
關(guān)注
22文章
2114瀏覽量
73904 -
變量
+關(guān)注
關(guān)注
0文章
613瀏覽量
28478 -
結(jié)構(gòu)體
+關(guān)注
關(guān)注
1文章
130瀏覽量
10875
發(fā)布評論請先 登錄
相關(guān)推薦
C語言中結(jié)構(gòu)體struct的用法
結(jié)構(gòu)體使用方法
C語言結(jié)構(gòu)體(struct)用法的詳解
![C語言<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>(struct)<b class='flag-5'>用法</b>的<b class='flag-5'>詳解</b>](https://file.elecfans.com/web2/M00/93/35/pYYBAGP0KMGAYVMyAAB6Fqm8pJQ835.jpg)
C語言-結(jié)構(gòu)體對齊詳解
如何定義結(jié)構(gòu)體?
USART初始化結(jié)構(gòu)體詳解
請教下有沒有好的用法可以將結(jié)構(gòu)體和easyflash結(jié)合進(jìn)行使用?
OrCAD中創(chuàng)建總線及用法詳解
c語言_結(jié)構(gòu)體和共同體
Typedef用法小結(jié)
ADC0809用法詳解_引腳圖及功能_工作原理_內(nèi)部結(jié)構(gòu)及應(yīng)用電路
![ADC0809<b class='flag-5'>用法</b><b class='flag-5'>詳解</b>_引腳圖及功能_工作原理_內(nèi)部<b class='flag-5'>結(jié)構(gòu)</b>及應(yīng)用電路](https://file1.elecfans.com//web2/M00/A7/14/wKgZomUMQj6AC7GOAABDq5_Y6Hg899.png)
C語言結(jié)構(gòu)體(struct)用法詳解
![C語言<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>體</b>(struct)<b class='flag-5'>用法</b><b class='flag-5'>詳解</b>](https://file1.elecfans.com/web2/M00/B0/2B/wKgZomVUfY-AeT8VAAAH8xRbMg0109.jpg)
評論