C++阶段01笔记08【结构体(基本概念、定义与使用、数组、指针、嵌套、const使用)】
C++| 匠心之作 從0到1入門(mén)學(xué)編程【視頻+課件+筆記+源碼】
目錄
8 結(jié)構(gòu)體
8.1 結(jié)構(gòu)體基本概念
8.2 結(jié)構(gòu)體定義和使用
示例
8.3 結(jié)構(gòu)體數(shù)組
示例
8.4 結(jié)構(gòu)體指針
示例
8.5 結(jié)構(gòu)體嵌套結(jié)構(gòu)體
示例
8.6 結(jié)構(gòu)體做函數(shù)參數(shù)
示例
8.7 結(jié)構(gòu)體中const使用場(chǎng)景
示例
8.8 結(jié)構(gòu)體案例
8.8.1 案例1
8.8.2 案例2
8 結(jié)構(gòu)體
8.1 結(jié)構(gòu)體基本概念
結(jié)構(gòu)體屬于用戶(hù)自定義的數(shù)據(jù)類(lèi)型,允許用戶(hù)存儲(chǔ)不同的數(shù)據(jù)類(lèi)型。
C++內(nèi)置數(shù)據(jù)類(lèi)型:int、float、double、string、char ...
8.2 結(jié)構(gòu)體定義和使用
語(yǔ)法:struct 結(jié)構(gòu)體名 { 結(jié)構(gòu)體成員列表 };
通過(guò)結(jié)構(gòu)體創(chuàng)建變量的方式有3種:
struct 結(jié)構(gòu)體名 變量名
struct 結(jié)構(gòu)體名 變量名 = { 成員1值 , 成員2值...}
定義結(jié)構(gòu)體時(shí),順便創(chuàng)建變量
示例
??
#include <iostream> #include <string> using namespace std;//1、創(chuàng)建學(xué)生數(shù)據(jù)類(lèi)型:學(xué)生包括(姓名、年齡、分?jǐn)?shù)) //自定義數(shù)據(jù)類(lèi)型,一些數(shù)據(jù)類(lèi)型集合組成的一個(gè)類(lèi)型(其實(shí)就是內(nèi)置數(shù)據(jù)類(lèi)型的集合)。 //語(yǔ)法:struct 類(lèi)型名稱(chēng) { 成員列表 }//結(jié)構(gòu)體定義 struct student //結(jié)構(gòu)體名稱(chēng)-見(jiàn)名知意 {//成員列表---學(xué)生屬性string name; //姓名int age; //年齡int score; //分?jǐn)?shù) } stu3; //結(jié)構(gòu)體變量創(chuàng)建方式3//2、通過(guò)學(xué)生類(lèi)型創(chuàng)建具體學(xué)生(共有3種方式)//2.1、struct student s1; // s1就是變量名 //2.2、struct student s2 = {...}; // 創(chuàng)建變量的同時(shí)賦初值 //2.3、在定義結(jié)構(gòu)體時(shí)順便創(chuàng)建結(jié)構(gòu)體變量int main() {//【結(jié)構(gòu)體變量創(chuàng)建方式1】2.1、struct student s1;struct student stu1; //創(chuàng)建結(jié)構(gòu)體時(shí),struct關(guān)鍵字可以省略//給stu1屬性賦值,通過(guò)“.”訪問(wèn)結(jié)構(gòu)體變量中的屬性stu1.name = "張三";stu1.age = 18;stu1.score = 100;//方式1打印輸出cout << "姓名:" << stu1.name << " 年齡:" << stu1.age << " 分?jǐn)?shù):" << stu1.score << endl;//【結(jié)構(gòu)體變量創(chuàng)建方式2】2.2、struct student s2 = {...};struct student stu2 = {"李四", 19, 60};//方式2打印輸出cout << "姓名:" << stu2.name << " 年齡:" << stu2.age << " 分?jǐn)?shù):" << stu2.score << endl;//【結(jié)構(gòu)體變量創(chuàng)建方式3】在定義結(jié)構(gòu)體時(shí)順便創(chuàng)建結(jié)構(gòu)體變量,不建議使用stu3.name = "王五";stu3.age = 18;stu3.score = 80;//方式3打印輸出cout << "姓名:" << stu3.name << " 年齡:" << stu3.age << " 分?jǐn)?shù):" << stu3.score << endl;system("pause");return 0; }- 總結(jié)1:定義結(jié)構(gòu)體時(shí)的關(guān)鍵字是struct,不可省略。
- 總結(jié)2:創(chuàng)建結(jié)構(gòu)體變量時(shí),關(guān)鍵字struct可以省略。
- 總結(jié)3:結(jié)構(gòu)體變量利用操作符 ''.'' 訪問(wèn)成員。
8.3 結(jié)構(gòu)體數(shù)組
作用:將自定義的結(jié)構(gòu)體放入到數(shù)組中方便維護(hù)。
語(yǔ)法:struct 結(jié)構(gòu)體名 數(shù)組名[元素個(gè)數(shù)] = { {} , {} , ... {} }
示例
?
#include <iostream> #include <string> using namespace std;//結(jié)構(gòu)體數(shù)組//1、定義結(jié)構(gòu)體 struct student {//成員列表string name; //姓名int age; //年齡int score; //分?jǐn)?shù) };int main() {//2、創(chuàng)建結(jié)構(gòu)體數(shù)組struct student stuArray[3] ={{"張三", 18, 88},{"李四", 28, 99},{"王五", 38, 66}};//3、給結(jié)構(gòu)體數(shù)組中的元素賦值stuArray[2].name = "趙六";stuArray[2].age = 66;stuArray[2].score = 99;//4、遍歷結(jié)構(gòu)體數(shù)組for (int i = 0; i < 3; i++){cout << "姓名:" << stuArray[i].name<< "\t年齡:" << stuArray[i].age<< "\t分?jǐn)?shù):" << stuArray[i].score << endl;}system("pause");return 0; }8.4 結(jié)構(gòu)體指針
作用:通過(guò)指針訪問(wèn)結(jié)構(gòu)體中的成員。// 利用結(jié)構(gòu)體指針操作結(jié)構(gòu)體成員。
-
利用操作符 ->可以通過(guò)結(jié)構(gòu)體指針訪問(wèn)結(jié)構(gòu)體屬性。
示例
?&s:取s的地址,返回s對(duì)應(yīng)的數(shù)據(jù)類(lèi)型的指針。
?
#include <iostream> #include <string> using namespace std;//結(jié)構(gòu)體指針//1、定義學(xué)生結(jié)構(gòu)體 struct student { //成員列表string name; //姓名int age; //年齡int score; //分?jǐn)?shù) };int main() {//2、創(chuàng)建學(xué)生結(jié)構(gòu)體變量// struct student stu = {"張三", 25, 100}; //struct可以省略student stu = {"張三", 25, 99}; //struct可以省略//3、通過(guò)指針指向結(jié)構(gòu)體變量// struct student *p = &stu; //struct可以省略student *p = &stu; //struct可以省略//結(jié)構(gòu)體變量,可以直接通過(guò).來(lái)訪問(wèn)cout << "姓名:" << stu.name << "\t年齡:" << stu.age << "\t分?jǐn)?shù):" << stu.score << endl;//4、通過(guò)指針訪問(wèn)結(jié)構(gòu)體變量中的數(shù)據(jù)p->score = 66; //指針通過(guò) -> 操作符可以訪問(wèn)成員//通過(guò)結(jié)構(gòu)體指針訪問(wèn)結(jié)構(gòu)體中的屬性,需要利用“->”cout << "姓名:" << p->name << "\t年齡:" << p->age << "\t分?jǐn)?shù):" << p->score << endl;system("pause");return 0; }- 總結(jié):結(jié)構(gòu)體指針可以通過(guò) -> 操作符 來(lái)訪問(wèn)結(jié)構(gòu)體中的成員。
8.5 結(jié)構(gòu)體嵌套結(jié)構(gòu)體
作用: 結(jié)構(gòu)體中的成員可以是另一個(gè)結(jié)構(gòu)體。
例如:每個(gè)老師輔導(dǎo)一個(gè)學(xué)員,一個(gè)老師的結(jié)構(gòu)體中,記錄一個(gè)學(xué)生的結(jié)構(gòu)體。
示例
#include <iostream> #include <string> using namespace std;// 結(jié)構(gòu)體嵌套結(jié)構(gòu)體//定義學(xué)生結(jié)構(gòu)體 struct student {//成員列表string name; //姓名int age; //年齡int score; //分?jǐn)?shù) };//定義教師結(jié)構(gòu)體 struct teacher {//成員列表int id; //教師編號(hào)string name; //教師姓名int age; //教師年齡struct student stu; //教師輔導(dǎo)的學(xué)生 子結(jié)構(gòu)體 };int main() {//創(chuàng)建教師結(jié)構(gòu)體變量struct teacher t1;t1.id = 333;t1.name = "老王";t1.age = 50;t1.stu.name = "張三";t1.stu.age = 18;t1.stu.score = 99;cout << "教師編號(hào):" << t1.id<< "\t教師姓名:" << t1.name<< "\t教師年齡:" << t1.age<< "\t教師輔導(dǎo)的學(xué)生姓名:" << t1.stu.name<< endl;cout << "學(xué)生姓名:" << t1.stu.name<< "\t學(xué)生年齡:" << t1.stu.age<< "\t學(xué)生考試分?jǐn)?shù):" << t1.stu.score<< endl;system("pause");return 0; }總結(jié):在結(jié)構(gòu)體中可以定義另一個(gè)結(jié)構(gòu)體作為成員,用來(lái)解決實(shí)際問(wèn)題。
8.6 結(jié)構(gòu)體做函數(shù)參數(shù)
作用:將結(jié)構(gòu)體作為參數(shù)向函數(shù)中傳遞。
傳遞方式有2種:
值傳遞
地址傳遞
示例
#include <iostream> #include <string> using namespace std;//定義學(xué)生結(jié)構(gòu)體 struct student {//成員列表string name; //姓名int age; //年齡int score; //分?jǐn)?shù) };//打印學(xué)生信息函數(shù) //1、值傳遞 void printStudent1(struct student stu) //(student stu) {stu.age = 28; //修改屬性cout << "1子函數(shù)中\(zhòng)t姓名:" << stu.name << "\t年齡:" << stu.age << "\t分?jǐn)?shù):" << stu.score << endl; }//2、地址傳遞 void printStudent2(struct student *stu) //用指針*stu接收地址 {stu->age = 28;cout << "2子函數(shù)中\(zhòng)t姓名:" << stu->name << "\t年齡:" << stu->age << "\t分?jǐn)?shù):" << stu->score << endl; }int main() {//結(jié)構(gòu)體作函數(shù)參數(shù)//將學(xué)生傳入到一個(gè)參數(shù)中,打印學(xué)生身上的所有信息//創(chuàng)建結(jié)構(gòu)體變量student stu = {"張三", 18, 100};stu.name = "李四";stu.age = 20;stu.score = 85;//1、值傳遞printStudent1(stu);cout << "1主函數(shù)中\(zhòng)t姓名:" << stu.name << "\t年齡:" << stu.age << "\t分?jǐn)?shù):" << stu.score << endl;cout << endl;//2、地址傳遞printStudent2(&stu);cout << "2主函數(shù)中\(zhòng)t姓名:" << stu.name << "\t年齡:" << stu.age << "\t分?jǐn)?shù):" << stu.score << endl;system("pause");return 0; }總結(jié):如果不想修改主函數(shù)中的數(shù)據(jù),用值傳遞,反之用地址傳遞。
8.7 結(jié)構(gòu)體中const使用場(chǎng)景
作用:用const來(lái)防止誤操作。
示例
#include <iostream> #include <string> using namespace std;//學(xué)生結(jié)構(gòu)體定義 struct student {//成員列表string name; //姓名int age; //年齡int score; //分?jǐn)?shù) };/** 值傳遞* stu.age = 150;//mian中的stu變量不會(huì)改變* 會(huì)將實(shí)參中的數(shù)據(jù)拷貝一份,放在形參s上* 無(wú)論形參如何改變,都不會(huì)影響實(shí)參* 1、實(shí)參有很多屬性,每個(gè)屬性都拷貝一份,拷貝的數(shù)據(jù)量很大* 2、假設(shè)一個(gè)學(xué)校有成千上萬(wàn)個(gè)人,每個(gè)人都調(diào)用printStudent函數(shù),拷貝成千上萬(wàn)份數(shù)據(jù),* 這樣數(shù)據(jù)量就會(huì)非常大,占用內(nèi)存空間大*/ void printStudent1(student stu) // (struct student stu) 省略struct {stu.age = 150; //mian中的stu變量不會(huì)改變cout << "姓名:" << stu.name << "\t年齡:" << stu.age << "\t分?jǐn)?shù):" << stu.score << endl; }// void printStudent3(const student stu) // (struct student stu) 省略struct // { // stu.age = 150; //mian中的stu變量不會(huì)改變 // cout << "姓名:" << stu.name << "\t年齡:" << stu.age << "\t分?jǐn)?shù):" << stu.score << endl; // }//將函數(shù)中的形參改為指針,可以減少內(nèi)存空間的使用,而且不會(huì)復(fù)制新的副本出來(lái)(值傳遞會(huì)復(fù)制整個(gè)結(jié)構(gòu)體元素) //const使用場(chǎng)景 void printStudent2(const student *stu) //加const防止函數(shù)體中的誤操作 指針*stu節(jié)省空間,一個(gè)指針占4個(gè)字節(jié)內(nèi)存 {//stu->age = 100; //操作失敗,因?yàn)榧恿薱onst修飾,常量指針無(wú)法修改指針指向的值,只能讀不能寫(xiě)。防止age的值會(huì)被修改//加入const之后,一旦有修改的操作就會(huì)報(bào)錯(cuò),可以防止我們的誤操作(加“const”防止誤操作)cout << "姓名:" << stu->name << "\t年齡:" << stu->age << "\t分?jǐn)?shù):" << stu->score << endl; }int main() {//創(chuàng)建結(jié)構(gòu)體變量student stu = {"張三", 18, 100};printStudent1(stu); //值傳遞//通過(guò)函數(shù)打印結(jié)構(gòu)體變量信息printStudent2(&stu); //傳入地址,在函數(shù)中指針接收地址cout << "main()中 張三的年齡為:" << stu.age << endl;system("pause");return 0; }8.8 結(jié)構(gòu)體案例
8.8.1 案例1
案例描述:
學(xué)校正在做畢設(shè)項(xiàng)目,每名老師帶領(lǐng)5個(gè)學(xué)生,總共有3名老師,需求如下:
- 設(shè)計(jì)學(xué)生和老師的結(jié)構(gòu)體,其中在老師的結(jié)構(gòu)體中,有老師姓名和一個(gè)存放5名學(xué)生的數(shù)組作為成員;
- 學(xué)生的成員有姓名、考試分?jǐn)?shù),創(chuàng)建數(shù)組存放3名老師,通過(guò)函數(shù)給每個(gè)老師及所帶的學(xué)生賦值;
- 最終打印出老師數(shù)據(jù)以及老師所帶的學(xué)生數(shù)據(jù)。
8.8.2 案例2
案例描述:
設(shè)計(jì)一個(gè)英雄的結(jié)構(gòu)體,包括成員姓名、年齡、性別;創(chuàng)建結(jié)構(gòu)體數(shù)組,數(shù)組中存放5名英雄。
通過(guò)冒泡排序的算法,將數(shù)組中的英雄按照年齡進(jìn)行升序排序,最終打印排序后的結(jié)果。
五名英雄信息如下:
{"劉備", 23, "男"},
{"關(guān)羽", 22, "男"},
{"張飛", 20, "男"},
{"趙云", 21, "男"},
{"貂蟬", 19, "女"},
此案例鍛煉的3點(diǎn):
總結(jié)
以上是生活随笔為你收集整理的C++阶段01笔记08【结构体(基本概念、定义与使用、数组、指针、嵌套、const使用)】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++阶段01笔记07【指针(基本概念、
- 下一篇: C++阶段01笔记汇总【C++软件安装、