问题描述:
根据下列代码回答下列问题。
代码:
// Created by 黑马程序员.
#include "iostream"
using namespace std;
int main()
{
struct Student
{
string name;
int age = 11;
string gender = "男";
};
struct Student arr1[3] = {{"周杰轮"}, {"林军杰"}, "王力鸿"};
struct Student * p1 = arr1; // 数组的对象本质上就是地址(指向数组的第一个元素的位置)
cout << "数组的第一个元素中记录的name是:" << p1[0].name << endl;
cout << "数组的第二个元素中记录的name是:" << p1[1].name << endl;
cout << "数组的第三个元素中记录的name是:" << p1[2].name << endl;
// 通过new操作符,自行申请结构体数组的空间(可以通过delete回收)
struct Student * p2 =
new Student[3] {{"周杰轮"}, {"林军杰"}, {"王力鸿"}};
cout << "数组2的第一个元素中记录的name是:" << p2[0].name << endl;
cout << "数组2的第二个元素中记录的name是:" << p2[1].name << endl;
cout << "数组2的第三个元素中记录的name是:" << p2[2].name << endl;
delete[] p2;
return 0;
}
结果:
D:\CLion_code\cmake-build-debug\CLion_code.exe
数组的第一个元素中记录的name是:周杰轮
数组的第二个元素中记录的name是:林军杰
数组的第三个元素中记录的name是:王力鸿
数组2的第一个元素中记录的name是:周杰轮
数组2的第二个元素中记录的name是:林军杰
数组2的第三个元素中记录的name是:王力鸿
Process finished with exit code 0
问题描述:
问题描述: 结构体如何使用指针数组呢?结构体同样可以使用指针数组,主要用于动态内存分配,方便管理大量结构体占用的内存。两种方法,第一种是静态内存管理,不能用delete回收内存。第二种,使用new申请指针数组的内存空间。通过结构体指针数组,访问结构体指针数组的成员,要使用的符号是什么呢?使用点因为p1[0]其实就是相当于*(p+0),这样就会解引用找到第一个元素结构体,那都是结构体了,肯定是用点而不是->
问题解答:
在使用结构体指针数组时,访问结构体成员的方式取决于你如何引用结构体数组中的元素。根据你的代码和问题描述,这里有两个关键点需要明确:
1. 静态内存管理(数组的对象在栈上分配内存)
在静态内存管理中,结构体数组 arr1
是直接在栈上分配的。指针 p1
指向数组的第一个元素。由于 p1
是指向结构体数组的指针,因此可以使用下标 []
直接访问数组元素。
struct Student * p1 = arr1; // p1 指向数组的第一个元素
这里 p1[0]
就是访问数组的第一个元素的结构体对象。因为 p1[0]
已经是一个结构体对象了,所以通过 .
操作符来访问结构体成员:
p1[0].name, p1[1].name, p1[2].name
2. 动态内存管理(使用 new
申请内存)
在动态内存管理中,结构体数组 p2
是使用 new
操作符在堆上分配的,因此可以通过 delete[]
来释放这块内存。
struct Student * p2 = new Student[3] {{"周杰轮"}, {"林军杰"}, {"王力鸿"}};
p2
也是指向结构体数组的指针,因此同样可以使用下标 []
来访问结构体数组中的元素,再通过 .
操作符访问具体的成员:
p2[0].name, p2[1].name, p2[2].name
总结:
- 通过指针访问结构体数组的元素时,
p1[i]
或p2[i]
代表指向结构体数组中第i
个元素的结构体对象。 - 既然
p1[i]
或p2[i]
是结构体对象,所以要通过.
操作符来访问结构体的成员,如p1[i].name
或p2[i].name
。
核心理解:
- 如果指针指向的是结构体对象(即
p1[i]
是结构体对象),就使用.
操作符访问成员。 - 如果指针直接指向结构体的地址(即
p
是指向结构体的指针),则使用->
操作符访问成员。
在你的问题中,由于 p1[i]
和 p2[i]
都是结构体对象,所以使用 .
操作符来访问它们的成员。