結構體
結構體基本概念
結構體屬于使用者自定義的資料類型,允許使用者存儲不同的資料類型
結構體定義和使用
文法 :struct 結構體名 { 結構體成員清單} ;
通過結構體建立變量的方式有三種:
- struct 結構體名 變量名
- struct 結構體名 變量名 = {成員1值,成員2值…}
- 定義結構體時順便建立變量
//結構體定義
struct student{
//成員清單
string name; //姓名
int age; //年齡
int score; //分數
}stu3;//結構體變量建立方式3
int main(){
//結構體變量建立方式1
struct student stu1; //struct 關鍵字可以省略
stu1.name = "張三";
stu1.age = 18;
stu1.score = 100;
cout << "姓名:" << stu1.name << "年齡:" << stu1.age << "分數:" << stu1.score << endl;
//結構體變量建立方式2
struct student stu2 = { "李四" ,19 ,60 };
cout << "姓名:" << stu2.name << "年齡:" << stu2.age << "分數:" << stu2.score << endl;
//結構體變量建立方式3
stu3.name = "王五";
stu3.age = 18;
stu3.score = 80;
cout << "姓名:" << stu3.name << "年齡:" << stu3.age << "分數:" << stu3.score << endl;
system("pause");
return 0;
}
總結1:定義結構體時的關鍵字是struct,不可省略
總結2:建立結構體變量時,關鍵字struct可以省略
總結3:結構體變量利用操作符“.” 通路成員
結構體數組
作用:将自定義的結構體放入到數組中友善維護
文法:struct 結構體名 數組名[元素個數] = { {} ,{} ,… ,{} }
//結構體定義
struct student{
//成員清單
string name; //姓名
int age; //年齡
int score; //分數
}
int main(){
//建立結構體數組
struct student arr[3]={
{"張三",18,80},
{"李四",19,60},
{"王五",20,99}
};
//給結構體數組中的元素指派
arr[2].name = "趙六";
arr[2].age = 80;
arr[2].age = 60;
//周遊結構體數組
for(int i; i < 3 ; i++){
cout << "姓名:" << arr[i].name
<< "年齡:" << arr[i].age
<< "分數:" << arr[i].score << endl;
}
system("pause");
return 0;
}
結構體指針
作用:通過指針通路結構體中的成員
- 利用操作符 “->” 可以通過結構體指針通路結構體屬性
//結構體定義
struct student{
//成員清單
string name; //姓名
int age; //年齡
int score; //分數
};
int main(){
//建立結構體變量
struct student stu = {"張三",18,100};
//通過指針指向結構體變量
struct student * p = &s;
//通過指針通路結構體變量中的資料
cout << "姓名:" << p->name << "年齡:" << p->age << "分數:" << p->score <<endl;
system("pause");
return 0;
}
總結:結構體指針可以通過 -> 操作符來通路結構體中的成員
結構體嵌套結構體
作用:結構體中的成員可以是另一個結構體
例如:每個老師輔導一個學生,一個老師的結構體中,記錄一個學生的結構體
//學生結構體定義
struct student{
//成員清單
string name; //姓名
int age; //年齡
int score; //分數
};
//教師結構體定義
struct teacher(){
//成員清單
int id; //職工編号
string name; //教師姓名
int age; //教師年齡
struct student stu; //子結構體 學生
};
int main(){
struct teacher t1;
t1.id = 10000;
t1.name = "老王";
t1.age = 40;
t1.stu.name = "張三";
t1.stu.age = 18;
t1.stu.score = 100;
cout << "教師職工編号:" << t1.id << "姓名:" << t1.name << "年齡:" << t1.age << endl;
cout << "學生姓名:" << t1.stu,name << "年齡:" << t1.stu.age << "分數:" << t1.stu.score <<endl;
system("pause");
return 0;
}
總結:在結構體中可以定義另一個結構體作為成員,用來解決實際問題
結構體做函數參數
作用:将結構體作為參數向函數中傳遞
- 值傳遞
- 位址傳遞
//學生結構體定義
struct student{
//成員清單
string name; //姓名
int age; //年齡
int score; //分數
};
//值傳遞
void printStudent1(struct student s ){
stu.age = 28;
cout <<"子函數1中 姓名:" << s.name << "年齡:" << s.age << "分數:" << s.score << endl;
}
//位址傳遞
void printStudent2(struct student * p){
stu->age = 28;
cout <<"子函數2中 姓名:" << p->name << "年齡:" << p->age << "分數:" << p->score << endl;
}
int main(){
//建立結構體變量
struct student s;
s.name = "張三";
s.age = 20;
s.score = 85;
printStudent1(s);
cout <<"主函數中 姓名:" << s.name << "年齡:" << s.age << "分數:" << s.score << endl;
printStudent2(&s);
cout <<"主函數中 姓名:" << s.name << "年齡:" << s.age << "分數:" << s.score << endl;
system("pause");
return 0;
}
結構體中const使用場景
//學生結構體定義
struct student{
//成員清單
string name; //姓名
int age; //年齡
int score; //分數
};
//将函數中的形參改為指針,可以減少記憶體空間,而且不會複制新的副本出來
void printStudents(const student *s){
//s->age = 150; //加入const之後,一旦有修改的操作就會報錯,可以防止我們的誤操作
cout <<"姓名:" << s->name << "年齡:" << s->age << "分數:" << s->score << endl;
}
int main(){
//建立結構體變量
struct student s = {"張三", 15, 70};
//通過函數列印結構體變量資訊
printStudents(&s);
system("pause");
return 0;
}