数据结构中的传值与传址
时间: 2024-08-18 08:00:37 浏览: 30
数据结构中的“传值”和“传址”通常指的是函数参数的传递方式,它们分别对应于值传递和引用传递的概念:
1. **值传递**(Copy-by-value):这是最基本的参数传递方式。当函数接收一个参数时,实际上是创建了一个该值的副本。这意味着函数内的操作只会影响副本,而不影响原来的变量。在大多数基本类型(如整数、浮点数、字符等)中,C/C++等语言采用值传递。
```c
void func(int a) {
a = 10; // 变量a只是复制的副本,原值不受影响
}
int main() {
int x = 5;
func(x);
printf("%d", x); // 输出:5,因为x未变
return 0;
}
```
2. **引用传递**(Pass-by-reference)或称为“地址传递”:对于复杂的数据结构(如数组或自定义结构体),函数可能会直接接受一个指针,以便对原数据结构进行操作。这种情况下,函数实际上是修改了指针指向的内存区域。
```c
void func(int* p) {
*p = 10; // 直接改变了指针所指向的值,影响原变量
}
int main() {
int x = 5;
func(&x);
printf("%d", x); // 输出:10,因为x已被修改
return 0;
}
```
相关问题
数据结构传值,什么是传址
传址是指在函数调用中,将实参的地址传递给形参,使得形参可以直接访问和修改实参的值。通过传址,形参和实参共享同一块内存空间,对形参的修改会直接影响到实参的值。传址可以通过指针作为形参来实现,函数内部可以通过解引用指针来访问和修改实参的值。传址的优点是可以减少内存的开销,因为不需要复制实参的值,而是直接操作实参的内存空间。
#### 引用[.reference_title]
- *1* *2* [数据结构——传值&传址](https://blog.csdn.net/Labrador_Katie/article/details/121788445)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
- *3* [c语言入门--函数的参数、传值调用和传址调用](https://blog.csdn.net/m0_70780664/article/details/126649700)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item]
[ .reference_list ]
vector pushback 加入一个结构,是传值还是传址
当使用 `push_back()` 函数将一个结构体添加到 vector 中时,实际上是将这个结构体的副本(也就是值)添加到 vector 中。因此,如果你修改 vector 中的某个结构体元素,不会影响原始的结构体值。
如果你想要在 vector 中存储结构体的指针而不是结构体本身,那么你需要将结构体的地址传递给 `push_back()` 函数。这样,你就可以通过指针修改原始的结构体值。
下面是一个例子,演示了如何将结构体的指针添加到 vector 中:
```c++
#include <iostream>
#include <vector>
using namespace std;
struct Person {
string name;
int age;
};
int main() {
vector<Person*> people;
Person person1 = {"Alice", 20};
Person person2 = {"Bob", 25};
people.push_back(&person1);
people.push_back(&person2);
// 修改原始结构体的值
people[0]->age = 21;
// 输出 vector 中的元素
for (int i=0; i<people.size(); i++) {
cout << people[i]->name << " " << people[i]->age << endl;
}
return 0;
}
```
输出结果为:
```
Alice 21
Bob 25
```
可以看到,通过将结构体的指针添加到 vector 中,我们可以修改原始结构体的值。