在C++编程语言中,指针是用于存储内存地址的变量,而结构体则是一种自定义的数据类型,它可以包含多个不同类型的成员。本篇将深入探讨如何使用指针与结构体数组,以及如何操作指向结构体变量的指针。
我们来看结构体数组。结构体数组是由多个结构体组成的集合,每个结构体都是一个独立的实体,包含了相同类型的成员。例如,我们可以定义一个`Student`结构体,用来存储学生的学号、姓名、性别、年龄、分数和地址:
```cpp
struct Student {
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};
```
然后,我们可以创建一个`Student`类型的数组,如`stu[3]`,用于存储三个学生的数据。结构体数组的初始化与普通数组类似,可以通过初始化列表来设置每个元素的初始值:
```cpp
Student stu[3] = {
{10101, "Li Lin", 'M', 18, 87.5, "103 Beijing Road"},
{10102, "Zhang Fun", 'M', 19, 99, "130 Shanghai Road"},
{10104, "Wang Min", 'F', 20, 78.5, "1010 Zhongshan Road"}
};
```
此外,还可以通过未指定数组大小的方式进行初始化,编译器会根据初始化列表自动推断数组大小:
```cpp
Student stu[] = {
{10101, "Li Lin", 'M', 18, 87.5, "103 Beijing Road"},
{10102, "Zhang Fun", 'M', 19, 99, "130 Shanghai Road"},
{10104, "Wang Min", 'F', 20, 78.5, "1010 Zhongshan Road"}
};
```
接下来,我们讨论指针在结构体数组中的应用。指针可以用来存储结构体变量的地址,允许我们间接访问结构体的成员。例如,我们可以定义一个指向`Student`类型的指针`pStu`:
```cpp
Student* pStu;
```
然后,我们可以让指针指向数组中的某个元素,例如`stu[0]`:
```cpp
pStu = &stu[0];
```
现在,通过`pStu`,我们可以访问并修改`stu[0]`的成员:
```cpp
cout << pStu->num << endl; // 输出stu[0].num的值
pStu->score = 90.0; // 修改stu[0].score的值
```
这里,`->`操作符用于访问指针所指向的结构体的成员。我们也可以使用解引用操作符`*`来访问成员,但通常`->`更方便:
```cpp
cout << (*pStu).num << endl; // 等同于上面的语句
```
在实际编程中,结构体数组和指针结合使用,可以实现更复杂的操作。例如,上述的投票统计程序中,定义了一个`Person`结构体数组`leader[3]`,用于存储候选人的姓名和得票数。程序通过遍历结构体数组和输入的候选人姓名,使用指针比较并更新得票数,最后输出每个候选人的得票结果。
通过这个例子,我们可以看到,指针结构体数组和指向结构体变量的指针是C++中处理复杂数据结构的有效工具。它们允许我们高效地操作和管理大量数据,尤其是在需要动态修改和查询数据时。理解这些概念对于深入学习C++编程至关重要。