[C++] 结构体Struct类型和变量定义
一、結構體的基本概念
結構體屬于用戶自定義的數據類型,允許用戶存儲不同的數據類型
二、結構體定義和使用
語法:struct 結構體名 {結構體成員列表};
- struct 結構體名 變量名
- struct 結構體名 變量名 = {成員1值,成員2值}
- 定義結構體時順便創建變量
1、創建學生數據j結構類型 : 學生包括(姓名, 年齡, 分數)
//自定義數據類型,一些類型集合組成的一個類型 //語法 struct 類型名稱 {成員列表} struct student {//成員列表//姓名string name;//年齡int age;//分數int score; }s3;2、通過學生結構類型從創建具體學生
int main() {//2.1 struct 結構體名 變量名(struct) student s1;//給s1屬性賦值,通過.訪問結構體變量中的屬性s1.name = "張三";s1.age = 18;s1.score = 100; cout<<"姓名:"<<s1.name<<"年齡:"<<s1.age<<"分數:"<<s1.score<<endl;//2.2 struct 結構體名 變量名 = {成員1值,成員2值}(struct) student s2 = {"李四", 19, 90};cout<<"姓名:"<<s2.name<<"年齡:"<<s2.age<<"分數:"<<s2.score<<endl;//2.3 定義結構體時順便創建變量s3.name = "王五";s3.age = 20;s3.score = 70; cout<<"姓名:"<<s3.name<<"年齡:"<<s3.age<<"分數:"<<s3.score<<endl; }也可以通過下面方式為學生結構體成員賦初值:
struct student { string name;int age;int score; }stu = {"ZhangSan" , 18, 100}; //定義類型的同時 定義變量并初始化或
struct student {string name;int age;int score;student() :name("ZhangSan"), age(18),score(100){} };三、結構體數組
1、定義結構體
struct student {//成員列表//姓名string name;//年齡int age;//分數int score; };2.、創建結構體數組并給結構體中的元素賦初值
int main() {struct student stuArray[3] = {{"張三", 19, 90},{"李四", 18, 100},{"王五", 20, 80},} }3、遍歷結構體數組
for (int i = 0; i<3; i++) { cout<<"姓名:"<<stuArray[i].name<<"年齡:"<<stuArray[i].age<<"分數:"<<stuArray[i].score<<endl; }四、結構體指針
struct student { string name;int age;int score; }stu= {"張三", 19, 90},*pStu ; //定義類型的同時 定義變量和賦初始值 并定義指針int main() {pStu = &stucout<<"姓名:"<<pStu->name<<"年齡:"<<pStu->age<<"分數:"<<pStu->score<<endl; }結構體指針的一般形式為:struct 結構名 *結構變量指針名
這里注意的是結構體指針變量需要先賦值之后才可以去使用。pStu = &stu 是正確的,但 pStu =&student 是錯誤的。
因為結構名和結構變量是兩個不同的概念。結構名只能表示一個結構形式,編譯系統并不對它分配內存空間。只有當某變量被說明為這種類型的結構時,才對該變量分配存儲空間。因此上面&Teacher這種寫法是錯誤的,不可能去取一個結構名的首地址。有了結構指針變量,就能更方便地訪問結構變量的各個成員。
五、結構體嵌套結構體
定義學生結構體:
struct student { string name;int age;int score; }定義老師結構體:
//定義老師結構體 struct teacher { int id;string name;int age;student stu; }//訪問老師中的結構體成員:
int main() {teacher t;t.id = 10086;t.name = "老王";t.age = 50;t.stu.name = "小王";t.stu.age = 20;t.stu.score = 90;cout<<"老師編號:"<<t.id<<"老師姓名:"<<t.name<<"老師年齡:"<<t.age"老師學生姓名:"<<t.stu.name<<endl; }六、結構體做函數參數
作用:將結構體作為參數向函數傳遞
傳遞方式有兩種:
- 值傳遞
- 地址傳遞
定義學生結構體:
struct student { string name;int age;int score; }打印學生信息的子函數(值傳遞)
void printStudent1(student s) { s.age = 40; //這里修改結構成員age 的值后,主函數調用該函數時,age 的值更新為40,但最終打印s1.age時,age 值不會改變。cout<<"姓名:"<<s.name<<"年齡:"<<s.age<<"分數:"<<s.score<<endl; }打印學生信息的子函數(地址傳遞)
void printStudent1(student * s){ s->age = 40;//這里修改結構成員age 的值后,主函數調用該函數和最終打印s1->age時,age的值都會更新為40.cout<<"姓名:"<<s->name<<"年齡:"<<s->age<<"分數:"<<s->score<<endl; }主函數調用子函數,打印學生信息的三種方式
int mian {student s1;s1.name = "張三";s1.age = 18;s1.score = 100; //法一:值傳遞printStudent1(s1);//法二:地址傳遞printStudent1(&s1); //法三:直接打印,使用值傳遞時,這里不會改變;使用地址傳遞時,如果子函數中成員發生改變,這里也會相應改變cout<<"姓名:"<<s1.name<<"年齡:"<<s1.age<<"分數:"<<s1.score<<endl; }值傳遞和地址傳遞的區別就是,使用值傳遞時,如果在子函數中對結構成員變量數值進行更改,不會更新結構成員的初始值,只會在調用該子函數的時候,更新結構成員的初始值。而地址傳遞在子函數中對結構成員變量數值進行更改,函數的初始值會相應更新。
總結:如果不想修改主函數中的值,用值傳遞,反之用地址傳遞。
七、結構體中const使用場景
作用:用const來防止誤操作()
const 使用場景:
struct student { string name;int age;int score; }stu = {"張三", 19, 90} ;這里采用地址傳遞,將函數中的形參改為指針,這樣可以減少內存,因為指針只占四個字節,而且不會像值傳遞那樣,復制一個新的結構成員副本出來。
但是雖然使用地址傳遞可以不用將成員信息全部都復制一遍,減少內存,但是為了防止在子函數中修改成員變量的值,導致主函數中成員變量的值發生改變,這里可以加上const
void printStudents(const student *s) { //s->age = 35; //加入const ,這時修改age的值就會報錯,可以防止我們的誤操作cout<<"姓名:"<<s->name<<"年齡:"<<s->age<<"分數:"<<s->score<<endl; }總結:const 的使用就是又想使用指針傳遞,又怕誤操作修改了子函數中的結構成員參數值,導致主函數中的結構成員參數值發生改變,即結構成員初始值發生改變。所以加上了const ,保證子函數只讀不寫(寫的時候s->age會提示報錯)。
?
| 戳戳小手幫忙點個免費的贊和關注吧,嘿嘿。 |
總結
以上是生活随笔為你收集整理的[C++] 结构体Struct类型和变量定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: structField、structTy
- 下一篇: 87. 扰乱字符串(Scramble S