C++学习 第十一天 结构体指针和嵌套结构体,结构体做函数参数

本文讲解了如何通过指针操作struct teacher结构体中的student子结构体,介绍了值传递与地址传递在函数参数中的应用,并强调了选择传递方式的重要性。

作用:通过指针访问结构体中的成员

例:每个老师辅导一个学员,一个老师的结构体中,记录一个学生的结构体

struct teacher
{
    //成员列表
	int id; //职工编号
	string name;  //教师姓名
	int age;   //教师年龄
	struct student stu; //子结构体 学生
};


int main() {

	struct teacher t1;
	t1.id = 10000;
	t1.name = "老王";
	t1.age = 40;

	t1.stu.name = "张三";
	t1.stu.age = 18;
	t1.stu.score = 100;

	cout << "教师 职工编号: " << t1.id << " 姓名: " << t1.name << " 年龄: " << t1.age << endl;
	
	cout << "辅导学员 姓名: " << t1.stu.name << " 年龄:" << t1.stu.age << " 考试分数: " << t1.stu.score << endl;

	system("pause");

	return 0;
}

结构体做函数参数

传递方式有两种:值传递和地址传递。

1、值传递和地址传递

struct student
{
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};

//值传递
void printStudent(student stu )
{
	stu.age = 28;
	cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;
}

//地址传递
void printStudent2(student *stu)
{
	stu->age = 28;
	cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age  << " 分数:" << stu->score << endl;
}

int main() {

	student stu = { "张三",18,100};
	//值传递
	printStudent(stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;

	cout << endl;

	//地址传递
	printStudent2(&stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;

	system("pause");

	return 0;
}

总结:如果不想修改主函数中的数据,用值传递,反之用地址传递

<think>首先,用户的问题是关于C++结构体指针嵌套调用的方法示例。根据系统级指令,我需要使用中文回答,确保行内数学表达式用$...$,独立公式用$$...$$,但这里可能没有数学表达式,所以主要关注C++代码。 关键点: - 回答必须结构清晰,帮助用户逐步解决问题。 - 使用中文。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 参考提供的引用:[^1] 讨论了C++指针结构体基础,[^2] 讨论了嵌套结构体的实例化,[^3] 讨论了结构体指针的声明使用。 用户意图:从上下文看,用户可能是上一个问题的延续,关于结构体指针的嵌套调用。引用[^2] 特别提到了嵌套结构体,包括动态分配指针使用。 我的回答结构: 1. **介绍问题**:简要解释什么是结构体指针嵌套调用。 2. **逐步解释方法**: - 定义嵌套结构体。 - 声明结构体指针。 - 如何访问嵌套成员。 - 示例代码。 3. **提供示例**:使用代码块展示一个完整的例子。 4. **添加引用**:在相关部分自然地添加引用标识。 5. **生成相关问题**:在最后添加§§相关问题§§部分。 参考引用: - [^1]:基础指针结构体知识。 - [^2]:嵌套结构体的动态分配。 - [^3]:结构体指针的声明使用。 示例代码思路: - 创建一个外层结构体,包含一个指向内层结构体指针。 - 展示如何分配内存、访问成员、释放内存。 回答大纲: 1. **理解结构体指针嵌套调用**:解释在C++中,结构体可以嵌套,指针可以用来访问嵌套成员。 2. **方法**: - 定义结构体:使用嵌套结构体定义。 - 指针声明:声明指向结构体指针。 - 内存分配:使用`new`动态分配内存。 - 访问成员:使用箭头运算符`->`访问指针成员。 - 释放内存:使用`delete`释放。 3. **完整示例**:写一个代码示例。 4. **注意事项**:提醒内存管理问题。 5. **引用**:在解释中引用相关部分。 6. **相关问题**:生成2-3个相关问题。 生成相关问题: - 基于主题,如: 1. 如何在C++中避免嵌套结构体指针的内存泄漏? 2. 嵌套结构体C++中的常见应用场景是什么? 3. 如何优化嵌套结构体指针的性能? 确保回答真实可靠:基于标准C++知识。</think>### C++结构体指针嵌套调用的方法示例 在C++中,结构体指针嵌套调用是指使用指针访问嵌套结构体成员的过程。这常用于动态管理内存、构建复杂数据结构(如链表或树),并提高代码的灵活性。下面我将逐步解释方法,并提供详细示例。参考引用中,[^1]介绍了指针结构体的基础,[^2]讨论了嵌套结构体的动态分配,[^3]则展示了结构体指针的声明方式。 #### 步骤解释 1. **定义嵌套结构体**: 首先,定义一个外层结构体,其中包含一个指向内层结构体指针成员。内层结构体可以是独立定义的,也可以嵌套在外层结构体内。 引用[^2]中提到,嵌套结构体不会自动实例化,需要通过指针动态分配内存[^2]。 2. **声明初始化指针**: - 声明指向外层结构体指针。 - 使用`new`运算符为外层结构体分配内存。 - 为内层结构体指针分配内存(通常在需要时手动创建)。 3. **访问嵌套成员**: - 使用箭头运算符`->`访问指针成员。 - 对于嵌套指针,可能需要多层`->`操作(例如`outerPtr->innerPtr->member`)。 4. **释放内存**: - 使用`delete`释放内层结构体内存。 - 释放外层结构体内存,避免内存泄漏。 #### 完整示例 以下代码展示了一个嵌套结构体指针的典型用法:外层结构体`Employee`包含一个指向内层结构体`Address`的指针。代码包括动态分配、成员访问内存释放。 ```cpp #include <iostream> #include <string> using namespace std; // 定义内层结构体 struct Address { string street; int zipCode; Address(string s, int z) : street(s), zipCode(z) {} // 构造函数 }; // 定义外层结构体 struct Employee { string name; int id; Address* addrPtr; // 指向内层结构体指针 Employee(string n, int i) : name(n), id(i), addrPtr(nullptr) {} // 构造函数,初始化指针为nullptr }; int main() { // 步骤1: 声明指向外层结构体指针,并动态分配内存 Employee* empPtr = new Employee("Alice", 1001); // 步骤2: 动态分配内层结构体(手动创建) empPtr->addrPtr = new Address("Main St", 12345); // 使用箭头运算符访问并分配 // 步骤3: 访问嵌套成员 cout << "Employee Name: " << empPtr->name << endl; cout << "Address: " << empPtr->addrPtr->street << ", ZIP: " << empPtr->addrPtr->zipCode << endl; // 多层嵌套访问 // 步骤4: 释放内存(先内层后外层) delete empPtr->addrPtr; // 释放内层结构体 delete empPtr; // 释放外层结构体 return 0; } ``` #### 输出示例 ``` Employee Name: Alice Address: Main St, ZIP: 12345 ``` #### 关键注意事项 - **内存管理**:动态分配后必须手动释放内存,否则会导致内存泄漏。参考[^3]强调,指针使用后需及时释放[^3]。 - **空指针检查**:在访问`addrPtr`前,应检查`empPtr->addrPtr != nullptr`,避免运行时崩溃。 - **性能优化**:对于频繁访问的场景,考虑使用智能指针(如`std::unique_ptr`)自动管理内存,减少错误。 - **嵌套深度**:多层嵌套可能使代码复杂化,建议限制在2-3层内,必要时使用类替代结构体。 引用[^2]指出,嵌套结构体通过指针动态分配时,实例化是可控的,这提高了灵活性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值