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