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

本文转载自:VC驿站

https://www.cctry.com/thread-289332-1-1.html

1、结构体类型和数组配合使用:
之前给大家介绍过数组,上节课又跟大家讲解了用户自定义的结构体类型,所以这里面将他们两个配合起来使用,再来举个之前学校学生的例子:

struct Student
{
    string name;
    int num;
    char sex;
    int age;
};

Student stu[100];

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

struct Student
{
        string name;
        int num;
        char sex;
        int age;
};

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

        //输入
        for (int idx = 0; idx < 2; ++idx)
        {
                cin >> stu[idx].name;
                cin >> stu[idx].num;
                cin >> stu[idx].sex;
                cin >> stu[idx].age;
        }

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

        return 0;
}

2、结构体变量作为函数参数:
结构体变量跟其他类型的变量一样使用,所以也可以作为函数的参数直接传递进去。默认情况下也是以值传递的方式。例如有一个函数,功能是设置学生的学号,函数的实现如下:

struct Student
{
        string name;
        int num;
        char sex;
        int age;
};

void set_num(Student stu)
{
        static int stu_num = 101;
        stu.num = stu_num++;
}

int main(int argc, char* argv[])
{
        Student stu[2] = 
        {
                { "aaa", 0, 'f', 10 },
                { "bbb", 0, 'm', 12 }
        };

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

        return 0;
}

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

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

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

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

Student stu;
stu.num = 102;

但如果是指针类型呢?我们可以这样做:

Student stu;
Student* pstu = &stu;
(*pstu).num = 102;

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

但是这么做可以说代码量少还可以,如果代码量比较多,写起来比较麻烦。所以C/C++中规定结构体类型的指针变量可以用 -> 符号来引用其成员,即如下:

Student stu;
Student* pstu = &stu;
pstu->num = 102;

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

4、改写 set_num 函数:

struct Student
{
        string name;
        int num;
        char sex;
        int age;
};

void set_num(Student* pstu)
{
        static int stu_num = 101;
        pstu->num = stu_num++;
}

int main(int argc, char* argv[])
{
        Student stu[2] = 
        {
                { "aaa", 0, 'f', 10 },
                { "bbb", 0, 'm', 12 }
        };

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

        return 0;
}

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课视频教程下载地址:

https://www.cctry.com/thread-289332-1-1.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值