VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 3227|回复: 92

《实用C++》第25课 结构体数组与指针

  [复制链接]
01_avatar_middle
online_admins admin 发表于 2018-2-26 01:01:08 | 显示全部楼层 |阅读模式
《实用C++》第25课 结构体数组与指针《实用C++》第25课 结构体数组与指针

1、结构体类型和数组配合使用:
之前给大家介绍过数组,上节课又跟大家讲解了用户自定义的结构体类型,所以这里面将他们两个配合起来使用,再来举个之前学校学生的例子:
  1. struct Student
  2. {
  3.     string name;
  4.     int num;
  5.     char sex;
  6.     int age;
  7. };

  8. Student stu[100];
复制代码


这样就定义了100个学生的信息,很方便吧!

  1. struct Student
  2. {
  3.         string name;
  4.         int num;
  5.         char sex;
  6.         int age;
  7. };

  8. int main(int argc, char* argv[])
  9. {
  10.         Student stu[2];

  11.         //输入
  12.         for (int idx = 0; idx < 2; ++idx)
  13.         {
  14.                 cin >> stu[idx].name;
  15.                 cin >> stu[idx].num;
  16.                 cin >> stu[idx].sex;
  17.                 cin >> stu[idx].age;
  18.         }

  19.         //输出
  20.         for (int idx = 0; idx < 2; ++idx)
  21.         {
  22.                 cout << stu[idx].name << " " << stu[idx].num << " " << stu[idx].sex << " " << stu[idx].age << endl;
  23.         }

  24.         return 0;
  25. }
复制代码


2、结构体变量作为函数参数:
结构体变量跟其他类型的变量一样使用,所以也可以作为函数的参数直接传递进去。默认情况下也是以值传递的方式。例如有一个函数,功能是设置学生的学号,函数的实现如下:
  1. struct Student
  2. {
  3.         string name;
  4.         int num;
  5.         char sex;
  6.         int age;
  7. };

  8. void set_num(Student stu)
  9. {
  10.         static int stu_num = 101;
  11.         stu.num = stu_num++;
  12. }

  13. int main(int argc, char* argv[])
  14. {
  15.         Student stu[2] =
  16.         {
  17.                 { "aaa", 0, 'f', 10 },
  18.                 { "bbb", 0, 'm', 12 }
  19.         };

  20.         //遍历
  21.         for (int idx = 0; idx < 2; ++idx)
  22.         {
  23.                 set_num(stu[idx]);
  24.                 cout << stu[idx].name << " " << stu[idx].num << " " << stu[idx].sex << " " << stu[idx].age << endl;
  25.         }

  26.         return 0;
  27. }
复制代码


具体代码编写及讲解见视频教程!

以上代码中的 set_num 函数真的能实现修改 stu 的学号吗?答案是否定的。上面已经跟大家说过了结构体类型变量作为函数的参数传递的时候也是以值传递的方式进行的,在函数调用的过程中实参 stu[idx] 会拷贝一份给形参,即进行 Student 类型变量的拷贝工作,会将 Student 类型内部的变量一个一个的复制过去。所以 set_num 函数是没办法修改外部的 stu[2] 数组里面的学生学号信息的。

解决方法相信大家已经想到了,将参数改成传递 Student* 指针的方式,一方面可以保证 set_num 函数可以修改外部的实参,还有一个好处大家想到了吗?那就是可以防止 Student 类型变量的拷贝工作,提高效率。当前 Student 类型变量内部只有四个成员,可以说不多,但是在以后的编程过程中某个结构体或者类对象中可能包含几十个成员,这个时候如果进行拷贝的话开销可想而知。所以有时候即使不想在函数的内部修改实参的值,函数的参数类型也想定义成指针的类型就是这个目的。

3、指向结构体变量的指针:
结构体变量指针的作用在上面的知识点中已经说的够详细的了,下面就给大家演示下如何来用!
之前给大家说过,结构体类型变量引用其成员的时候可以使用符号 . 来引用,例如:
  1. Student stu;
  2. stu.num = 102;
复制代码

但如果是指针类型呢?我们可以这样做:
  1. Student stu;
  2. Student* pstu = &stu;
  3. (*pstu).num = 102;
复制代码

没问题吧?pstu是指向stu变量的指针,所以前面加上符号*就变成stu变量本身了。变成 stu本身了之后再用 . 来引用就可以了。

但是这么做可以说代码量少还可以,如果代码量比较多,写起来比较麻烦。所以C/C++中规定结构体类型的指针变量可以用 -> 符号来引用其成员,即如下:
  1. Student stu;
  2. Student* pstu = &stu;
  3. pstu->num = 102;
复制代码


这样写起来就简单了。就是把 . 换成 -> 就可以了,方便吧?

4、改写 set_num 函数:
  1. struct Student
  2. {
  3.         string name;
  4.         int num;
  5.         char sex;
  6.         int age;
  7. };

  8. void set_num(Student* pstu)
  9. {
  10.         static int stu_num = 101;
  11.         pstu->num = stu_num++;
  12. }

  13. int main(int argc, char* argv[])
  14. {
  15.         Student stu[2] =
  16.         {
  17.                 { "aaa", 0, 'f', 10 },
  18.                 { "bbb", 0, 'm', 12 }
  19.         };

  20.         //遍历
  21.         for (int idx = 0; idx < 2; ++idx)
  22.         {
  23.                 set_num(&stu[idx]);
  24.                 cout << stu[idx].name << " " << stu[idx].num << " " << stu[idx].sex << " " << stu[idx].age << endl;
  25.         }

  26.         return 0;
  27. }
复制代码


5、小作业:
①、根据运算符的优先级,大家想一下:
Student stu[2] =
{
        { "aaa", 0, 'f', 10 },
        { "bbb", 0, 'm', 12 }
};

Student* pstu = stu;
++p->num = 202; //这句代码执行之后,到底是stu[0] 的 num 值变化了,还是 stu[1] 的 num 值变化了?

②、定义一个学生类型的结构体,包含学生的:姓名、学号、分数。之后用该结构体定义大小为5的结构体变量数组。手动输入给数组成员赋值,之后将5个学生的信息输出出来,并且求出5个学生的分数的平均值也一起输出出来。

第25课免费试看,下载地址回复后可见:
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:http://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################
《实用C++》第25课 结构体数组与指针《实用C++》第25课 结构体数组与指针

评分

参与人数 1驿站币 +2 热心值 +2 收起 理由
98_avatar_small 海神号 + 2 + 2 THANKYOU!!!

查看全部评分





上一篇:《实用C++》第24课 结构体类型
下一篇:函数调用

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

08_avatar_middle
在线会员 woliveyou 发表于 2018-3-3 21:30:33 | 显示全部楼层
《实用C++》第25课 结构体数组与指针

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

08_avatar_middle
在线会员 guanghua1982 发表于 2018-3-4 15:08:04 | 显示全部楼层
等着老大更新地址!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

78_avatar_middle
在线会员 csa 发表于 2018-3-4 21:44:39 | 显示全部楼层
又更新啦,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

18_avatar_middle
online_vip 听雨声等你笑 发表于 2018-3-5 07:47:33 | 显示全部楼层
学习学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

10_avatar_middle
online_vip08 小菜一碟 发表于 2018-3-5 08:33:17 | 显示全部楼层
继续学习,反复练习《实用C++》第25课 结构体数组与指针

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
在线会员 tomok 发表于 2018-3-5 09:46:18 | 显示全部楼层
学习资料

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

22_avatar_middle
online_vip jesy 发表于 2018-3-5 20:25:44 | 显示全部楼层
学习了啊

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-3-5 20:27:01 | 显示全部楼层
看看                     

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
在线会员 zp521 发表于 2018-3-5 22:49:09 | 显示全部楼层
继续学习!!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

60_avatar_middle
online_vip zy89918042 发表于 2018-3-6 18:33:17 | 显示全部楼层

又更新啦,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

17_avatar_middle
在线会员 chenhu 发表于 2018-3-11 11:50:49 | 显示全部楼层
等着老大更新地址!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

18_avatar_middle
在线会员 Sylm 发表于 2018-3-13 15:28:20 | 显示全部楼层
继续学习,反复练习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

93_avatar_middle
在线会员 wwwqqqwqqqoo 发表于 2018-3-13 20:33:33 | 显示全部楼层
xuexixuexi

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

13_avatar_middle
在线会员 冬季恋歌 发表于 2018-3-13 21:23:51 | 显示全部楼层
期待下次更新

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 awfymwvf 发表于 2018-3-15 11:00:31 | 显示全部楼层
谢谢管理,下载看看。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

94_avatar_middle
online_vip08 Mtong 发表于 2018-3-17 17:58:05 | 显示全部楼层
开始学习了!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

13_avatar_middle
online_vip 明天你好123 发表于 2018-3-17 18:50:34 | 显示全部楼层
hello world

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 hbjdt 发表于 2018-3-21 18:27:54 | 显示全部楼层
谢谢版主,辛苦了

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

15_avatar_middle
在线会员 矿泉水 发表于 2018-3-21 23:15:40 | 显示全部楼层
支持支持支持

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-10-22 14:49

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表