1. 程式人生 > 其它 >結構體(struct)的使用

結構體(struct)的使用

結構體(struct)的使用

結構體在很多場合中非常常用,可以將若干個不同的資料型別的變數或陣列封裝在一起,一儲存自定義的資料結構,方便儲存一些複合資料。

結構體的定義

定義一個結構體的基本格式如下

struct Name{
	//一些基本的資料結構或者自定義的資料型別
}

例如,需要儲存一個學生的學號、性別、姓名和專業,就可以這樣定義:

struct studentInfo{
	int id;
	char gender;//'F'or'M'
	char name[20];
	char major[20];
}Alice,Bob,stu[1000];

其中studentInfo是結構體的名字,內部定義了id(學號)、gender(性別)、name(名字)和major(專業)。而大括號外定義了studentInfo型的Alice和Bob代表兩個結構體變數

;之後的stu[1000]就是當有很多學生時定義的一個結構體陣列(如果不在此處定義變數或陣列,則大括號外直接跟上分號)

結構體也可以按照基本資料型別那樣定義

studentInfo Alice;
studentInfo stu[1000];

需要注意的是,結構體裡面能定義除了自己本身(這樣會引起迴圈定義的問題)之外的任何資料型別。不過雖然不能定義自己本身,但是可以定義自身型別的指標變數。例如:

struct node{
	node n;//不能定義node型變數
	node* next;//可以定義node*型別的指標變數
}

訪問結構體內的元素

兩種方法:“.”操作和“->”操作。現在把studentInfo型別定義成下面這樣:

struct studentIfo{
 int id;
 char name[20];
 studentInfo* next;
}stu, *p;

這樣studentInfo中多了一個指標next來指向下一個學生的地址,且結構體變數中定義了普通型別變數stu和指標變數p。

於是訪問stu中變數的寫法如下:

stu.id
stu.name
stu.next

訪問指標變數p中元素的寫法如下:

(*p).id
(*p).name
(*p).next

另一種訪問結構體指標變數內元素的更簡潔的寫法:

p->id
p->name
p->next

使用*或->訪問結構體指標變數內元素的寫法是完全等價的。

結構體的初始化

使用“建構函式”的方法來進行初始化。所謂建構函式就是用來初始化結構體的一種函式,它直接定義在結構體中。建構函式的一個特點就是它不需要寫返回型別,且函式名與結構體名相同

一般對於一個普通定義的結構體,其內部會生成一個預設的建構函式(但是不可見)

struct studentInfo{
	int id;
	char gender;
	//預設生成的建構函式
	studentInfo(){}//沒有返回型別,沒有引數,沒有函式體
};

那麼,如果想要自己手動提供id和gender的初始化引數,要怎麼做?需要提供初始化引數來對結構體內部的變數進行賦值

struct studentInfo{
	int id;
	char gender;
	
	//把下面引數用以對結構體內部變數進行賦值
	studentInfo(int _id, char _gender){
		//賦值
		id = _id;
		gender = _gender;
	}
}

其中 _ id和 _ gender都是變數名,只要不和已有變數名衝突就行。

建構函式也可以簡化成一行

xstruct studentInfo{    
    int id;    char gender;        
    studentInfo(int _id, char _gender):id(_id), gender(_gender) {}
}

這樣可以在需要時直接對結構體變數進行賦值了:

studentInfostu = studentIfo(10086, 'M')

注意:如果自己重新定義了建構函式,就不能不經初始化就定義結構體變數。為了既能不初始化就定義結構體變數,又能享受初始化帶來的便捷。我們可以吧studentInfo(){}手動加上。這意味著,只要引數個數和型別不完全相同,就可以定義任意多個建構函式,以適應不同的初始化場合。例項:

struct studentIfo{
	int id;
	char gender;
	//可以不初始化就定義結構體變數
	studentInfo(){}
	//只初始化gender
	studentInfo(char _gender){
		gender = _gender;
	}
	//同時初始化gender和id
	studentIfo(int _id, char _gender){
		id = _id;
		char = _char;
	}
};