• C++ 学习(八)结构体、结构体数组、结构体指针、结构体嵌套、结构体作为参数、结构体中const使用


    1、结构体

    结构体是用户自定义的数据类型,允许用户存储不同的数据类型;在结构体中可以为不同项定义不同的数据类型。

    C++ 结构体

    语法:

    struct 结构体名 { 结构体成员列表 };

    三种定义结构体变量方式:

    1.  [struct]  结构体名  变量名 (可省略struct)
    2.  [struct]  结构体名  变量名 = { 成员1值, 成员2值 ...... }  (可省略struct)
    3.  定义结构体时创建变量
    1. #include
    2. #include
    3. using namespace std;
    4. //结构体定义
    5. //人类
    6. struct Person
    7. {
    8. //姓名
    9. string name;
    10. //性别
    11. string sex;
    12. //年龄
    13. int age;
    14. } s3; //第三种创建结构体变量:结构体变量在定义时创建
    15. //结构体成员输出
    16. void print(Person s)
    17. {
    18. cout << "s1结构体:姓名:" << s.name << ", 性别:" << s.sex << ", 年龄:" << s.age << endl;
    19. }
    20. int main()
    21. {
    22. //第一种创建结构体变量:[struct]  结构体名  变量名; (可省略struct)
    23. struct Person s1;
    24. //成员赋值
    25. s1.name = "Tracy";
    26. s1.sex = "女";
    27. s1.age = 20;
    28. //成员输出
    29. print(s1);
    30. //第二种创建结构体变量: [struct]  结构体名  变量名 = { 成员1值, 成员2值 ...... }  (可省略struct)
    31. Person s2 = { "Felix", "男", 16 };
    32. //成员输出
    33. print(s2);
    34. //第三种创建结构体变量:见结构体定义处
    35. //成员赋值
    36. s3.name = "Timo";
    37. s3.sex = "女";
    38. s3.age = 60;
    39. //成员输出
    40. print(s3);
    41. system("pause");
    42. return 0;
    43. }

     输出结果

    s1结构体:姓名:Tracy, 性别:女, 年龄:20
    s2结构体:姓名:Felix, 性别:男, 年龄:16
    s3结构体:姓名:Timo, 性别:女, 年龄:60

    Go语言结构体

    语法:

    type 结构体名 struct { 结构体成员列表 } 

    三种定义结构体变量方式:

    1. var 变量名 结构体名
    2. 变量名 := 结构体名{ 成员1值, 成员2值 ...}
    3. 变量名 := 结构体名{ 成员名1:值1,成员名2:值2,... }
    1. package main
    2. import "fmt"
    3. //人类
    4. type Person struct {
    5. //姓名
    6. name string
    7. //性别
    8. sex string
    9. //年龄
    10. age int
    11. }
    12. func main() {
    13. //第一种创建结构体变量:var 变量名 结构体名
    14. var s1 Person
    15. //成员赋值
    16. s1.name = "Tracy"
    17. s1.sex = "女"
    18. s1.age = 20
    19. //成员输出
    20. print(s1)
    21. //第二种创建结构体变量:变量名 := 结构体名{ 成员1值, 成员2值 ...}
    22. s2 := Person{ "Felix", "男", 16 }
    23. //成员输出
    24. print(s2)
    25. //第三种创建结构体变量:变量名 := 结构体名{ 成员名1:值1,成员名2:值2,... }
    26. s3 := Person{
    27. name: "Timo",
    28. age: 60,
    29. sex: "女",
    30. }
    31. //成员输出
    32. print(s3)
    33. }
    34. //结构体成员输出
    35. func print(s Person) {
    36. fmt.Printf("s1结构体:姓名:%s, 性别:%s, 年龄:%d\n", s.name, s.sex, s.age)
    37. }

     输出结果

    s1结构体:姓名:Tracy, 性别:女, 年龄:20
    s1结构体:姓名:Felix, 性别:男, 年龄:16
    s1结构体:姓名:Timo, 性别:女, 年龄:60

    2、结构体数组

    C++结构体数组

    1. #include
    2. #include
    3. using namespace std;
    4. //结构体定义
    5. //人类
    6. struct Person
    7. {
    8. //姓名
    9. string name;
    10. //性别
    11. string sex;
    12. //年龄
    13. int age;
    14. };
    15. int main()
    16. {
    17. //结构体数组变量定义并初始化
    18. struct Person s[3] = {
    19. { "Felix", "男", 16 },
    20. { "Tracy", "女", 20 },
    21. { "Timo", "男", 60 }
    22. };
    23. //结构体数组元素赋值
    24. s[0].age = 17;
    25. //成员输出
    26. for (int i = 0;i < 3;i++) {
    27. cout << "s结构体数组:姓名:" << s[i].name << ", 性别:" << s[i].sex << ", 年龄:" << s[i].age << endl;
    28. }
    29. system("pause");
    30. return 0;
    31. }

    输出结果

    s结构体数组:姓名:Felix, 性别:男, 年龄:17
    s结构体数组:姓名:Tracy, 性别:女, 年龄:20
    s结构体数组:姓名:Timo, 性别:男, 年龄:60

    Go语言结构体数组

    1. package main
    2. import "fmt"
    3. //人类
    4. type Person struct {
    5. //姓名
    6. name string
    7. //性别
    8. sex string
    9. //年龄
    10. age int
    11. }
    12. func main() {
    13. //结构体数组变量定义并初始化
    14. var s [3]Person = [3]Person{
    15. { "Felix", "男", 16 },
    16. { "Tracy", "女", 20 },
    17. { "Timo", "男", 60 },
    18. }
    19. //结构体数组元素赋值
    20. s[0].age = 17
    21. //成员输出
    22. for i := 0; i < 3; i++ {
    23. fmt.Printf("s结构体数组:姓名:%s, 性别:%s, 年龄:%d\n", s[i].name, s[i].sex, s[i].age)
    24. }
    25. }

    输出结果 

    s结构体数组:姓名:Felix, 性别:男, 年龄:17
    s结构体数组:姓名:Tracy, 性别:女, 年龄:20
    s结构体数组:姓名:Timo, 性别:男, 年龄:60

    3、 结构体指针

    C++结构体指针

    通过操作符 -> 访问结构体中的成员。

    1. #include
    2. #include
    3. using namespace std;
    4. //结构体定义
    5. //人类
    6. struct Person
    7. {
    8. //姓名
    9. string name;
    10. //性别
    11. string sex;
    12. //年龄
    13. int age;
    14. };
    15. int main()
    16. {
    17. //结构体指针
    18. Person* s = new Person;
    19. cout << "s结构体指化针变量初始化值:" << s << endl;
    20. cout << "s结构体指化针变量初始化成员值:姓名:" << s->name << ", 性别:" << s->sex << ", 年龄:" << s->age << endl;
    21. //结构体指针元素赋值
    22. s->name = "Tracy";
    23. s->sex = "female";
    24. s->age = 20;
    25. //成员访问输出
    26. cout << "s结构体指针:姓名:" << s->name << ", 性别:" << s->sex << ", 年龄:" << s->age << endl;
    27. system("pause");
    28. return 0;
    29. }

    输出结果

    s结构体指化针变量初始化值:000001A95760DAB0
    s结构体指化针变量初始化成员值:姓名:, 性别:, 年龄:-842150451
    s结构体指针:姓名:Tracy, 性别:female, 年龄:20

    Go语言结构体指针

    结构体指针与结构体值类型一样,通过操作符 . 访问结构体中的成员。

    1. package main
    2. import (
    3. "fmt"
    4. )
    5. //人类
    6. type Person struct {
    7. //姓名
    8. name string
    9. //性别
    10. sex string
    11. //年龄
    12. age int
    13. }
    14. func main() {
    15. //结构体指针
    16. var s *Person
    17. fmt.Println("s结构体指针变量初始值:", s)
    18. //使用new初始化结构体指针
    19. s = new(Person)
    20. fmt.Println("s结构体指化针变量初始化值:", s)
    21. //初始化后结构体成员为成员类型的零值
    22. fmt.Printf("s结构体指化针变量初始化成员值:姓名:%s, 性别:%s, 年龄:%d\n", s.name, s.sex, s.age)
    23. //成员赋值
    24. s.name = "Tracy"
    25. s.sex = "女"
    26. s.age = 20
    27. //成员访问输出
    28. fmt.Printf("s结构体指针:姓名:%s, 性别:%s, 年龄:%d\n", s.name, s.sex, s.age)
    29. }

     输出结果

    s结构体指针变量初始值:
    s结构体指化针变量初始化值: &{  0}
    s结构体指化针变量初始化成员值:姓名:, 性别:, 年龄:0
    s结构体指针:姓名:Tracy, 性别:女, 年龄:20

    4、结构体嵌套 

    C++结构体嵌套

    1. #include
    2. #include
    3. using namespace std;
    4. //结构体定义
    5. //人类
    6. struct Person
    7. {
    8. //姓名
    9. string name;
    10. //性别
    11. string sex;
    12. //年龄
    13. int age;
    14. };
    15. //员工
    16. struct Employee
    17. {
    18. //人类结构体
    19. Person person;
    20. //职位
    21. string position;
    22. };
    23. int main()
    24. {
    25. //结构体嵌套
    26. Employee employee;
    27. //成员属性赋值
    28. employee.person.name = "Tracy";
    29. employee.person.sex = "女";
    30. employee.person.age = 20;
    31. employee.position = "软件开发工程师";
    32. //成员访问输出
    33. cout << "员工姓名:" << employee.person.name
    34. << "性别:" << employee.person.sex
    35. << "年龄:" << employee.person.age
    36. << "职位:" << employee.position << endl;
    37. system("pause");
    38. return 0;
    39. }

    输出结果

    员工姓名:Tracy性别:女年龄:20职位:软件开发工程师

    Go语言结构体嵌套

    1. package main
    2. import "fmt"
    3. //人类
    4. type Person struct {
    5. //姓名
    6. name string
    7. //性别
    8. sex string
    9. //年龄
    10. age int
    11. }
    12. //员工
    13. type Employee struct {
    14. //人类结构体
    15. person Person
    16. //职位
    17. position string
    18. }
    19. func main() {
    20. var employee = Employee{
    21. person: Person{
    22. name: "Tracy",
    23. sex: "女",
    24. age: 20,
    25. },
    26. position: "软件开发工程师",
    27. }
    28. //成员访问输出
    29. fmt.Printf("员工姓名:%v, 性别:%v, 年龄:%v, 职位:%v",
    30. employee.person.name, employee.person.sex, employee.person.age, employee.position)
    31. }

    输出结果

     员工姓名:Tracy, 性别:女, 年龄:20, 职位:软件开发工程师

    5、结构体作为参数

    结构体作为参数可以值传递,也可以地址传递。

    C++ 结构体作为参数

    1. #include
    2. #include
    3. using namespace std;
    4. //结构体定义
    5. //人类
    6. struct Person
    7. {
    8. //姓名
    9. string name;
    10. //性别
    11. string sex;
    12. //年龄
    13. int age;
    14. };
    15. //结构体作为值参数传递
    16. void printPerson(Person s)
    17. {
    18. cout << "结构体值参数传递:姓名:" << s.name
    19. << ", 性别:" << s.sex
    20. << ", 年龄:" << s.age << endl;
    21. s.name = "Tracy";
    22. }
    23. //结构体作为地址参数传递
    24. void printPerson(Person *s)
    25. {
    26. cout << "结构体地址参数传递:姓名:" << s->name
    27. << ", 性别:" << s->sex
    28. << ", 年龄:" << s->age << endl;
    29. s->name = "Tracy";
    30. }
    31. int main()
    32. {
    33. //结构体作为参数传递
    34. Person person = { "Felix", "男", 16 };
    35. //值参数传递
    36. printPerson(person);
    37. cout << "结构体值参数传递后成员无变化:姓名:" << person.name
    38. << ", 性别:" << person.sex
    39. << ", 年龄:" << person.age << endl;
    40. //地址参数传递
    41. printPerson(&person);
    42. cout << "结构体值参数传递后成员有变化:姓名:" << person.name
    43. << ", 性别:" << person.sex
    44. << ", 年龄:" << person.age << endl;
    45. system("pause");
    46. return 0;
    47. }

    输出结果

    结构体值参数传递:姓名:Felix, 性别:男, 年龄:16
    结构体值参数传递后成员无变化:姓名:Felix, 性别:男, 年龄:16
    结构体地址参数传递:姓名:Felix, 性别:男, 年龄:16
    结构体值参数传递后成员有变化:姓名:Tracy, 性别:男, 年龄:16

    Go语言结构体作为参数

    1. package main
    2. import "fmt"
    3. //人类
    4. type Person struct {
    5. //姓名
    6. name string
    7. //性别
    8. sex string
    9. //年龄
    10. age int
    11. }
    12. func main() {
    13. //结构体作为参数传递
    14. person := Person{ "Felix", "男", 16 }
    15. //值参数传递
    16. printPerson(person)
    17. fmt.Printf("结构体值参数传递:姓名:%s, 性别:%s, 年龄:%d\n",
    18. person.name, person.sex, person.age)
    19. //地址参数传递
    20. printPerson2(&person)
    21. fmt.Printf("结构体地址参数传递:姓名:%s, 性别:%s, 年龄:%d\n",
    22. person.name, person.sex, person.age)
    23. }
    24. //结构体作为值参数传递
    25. func printPerson(s Person) {
    26. fmt.Printf("结构体值参数传递后成员无变化:姓名:%s, 性别:%s, 年龄:%d\n", s.name, s.sex, s.age)
    27. s.name = "Tracy"
    28. }
    29. //结构体作为地址参数传递
    30. func printPerson2(s *Person) {
    31. fmt.Printf("结构体值参数传递后成员有变化:姓名:%s, 性别:%s, 年龄:%d\n", s.name, s.sex, s.age)
    32. s.name = "Tracy"
    33. }

    输出结果

    结构体值参数传递后成员无变化:姓名:Felix, 性别:男, 年龄:16
    结构体值参数传递:姓名:Felix, 性别:男, 年龄:16
    结构体值参数传递后成员有变化:姓名:Felix, 性别:男, 年龄:16
    结构体地址参数传递:姓名:Tracy, 性别:男, 年龄:16

    6、结构体中const使用

    C++ 结构体中const使用

    作为参数,使用const修饰,为防止误操作,修改成员值,如下代码第19行:

    void printPerson(const Person* s)

    1. #include
    2. #include
    3. using namespace std;
    4. //结构体定义
    5. //人类
    6. struct Person
    7. {
    8. //姓名
    9. string name;
    10. //性别
    11. string sex;
    12. //年龄
    13. int age;
    14. };
    15. //结构体 const使用
    16. void printPerson(const Person* s)
    17. {
    18. // s->name = "Tracy"; // 加const后,此处不能修改成员的值,为防止误操作
    19. cout << "结构体地址参数传递:姓名:" << s->name
    20. << ", 性别:" << s->sex
    21. << ", 年龄:" << s->age << endl;
    22. }
    23. int main()
    24. {
    25. //结构体 const使用
    26. Person person = { "Felix", "男", 16 };
    27. //地址参数传递
    28. printPerson(&person);
    29. system("pause");
    30. return 0;
    31. }

    Go语言 结构体中没有const使用方法

  • 相关阅读:
    Matlab论文插图绘制模板第42期—气泡矩阵图(相关系数矩阵图)
    matlab 基操~
    【 Java架构师-技术专家 】慕课2、springboot基础回顾
    Go语言之return语句深入理解及defer、return的执行顺序
    数据结构--二叉树
    【C++】哈希思想的应用——位图、布隆过滤器和哈希切割
    Unity3D 在做性能优化时怎么准确判断是内存、CPU、GPU瓶颈详解
    【qt】Qt Creator 设计界面与结果不一致问题
    修复 Android 手机陷入恢复模式的 5 种方法
    SpringCloud
  • 原文地址:https://blog.csdn.net/ling1998/article/details/125904146