在C++语言中,函数传递参数的方式可分为值传递和地址传递两种方式。在函数中调用变量时,这两种方法也有着显著不同的效果。
区别一:传递实参
在函数调用时,值传递是将实参中的值拷贝给形参,即开辟一块新的内存空间来存储实参的值。而地址传递则是将实参的地址传递给形参,形参指向实参所在内存地址的位置。如下示例代码:
```
void swap(int a, int b) // 值传递方式
{
int temp = a;
a = b;
b = temp;
}
void swap(int *a, int *b) // 地址传递方式
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x = 1, y = 2;
swap(x, y); // 值传递
swap(&x, &y); // 地址传递
return 0;
}
```
在值传递方式中,函数内部修改的是形参的值,不会对实参造成影响。在上述示例代码中,x和y的值不发生改变。而在地址传递方式中,函数内部修改的是实参内存中的值,因此函数调用结束后,实参的值发生了改变。
区别二:内存开销
在值传递方式中,实参和形参在内存中存储的位置不同,因此需要进行拷贝操作,导致了一定的内存开销。而在地址传递方式中,实参和形参在内存中存储的位置相同,不需要进行拷贝操作,从而节省了内存开销。但是,这种方式需要保证函数内部不会修改实参的地址所保存的内容,否则会破坏实参的值。
区别三:对指针的影响
在值传递方式中,函数内部对形参的修改不会影响到实参指向的指针。而在地址传递方式中,函数内部对形参的修改会影响到实参指向的指针。因此,在使用地址传递方式时,需要进行安全检查,以防止不必要的指针错误。如下示例代码:
```
void foo(int *p) // 地址传递方式
{
int a = 10;
p = &a;
}
int main()
{
int x = 1;
int *p = &x;
foo(p);
cout << *p << endl;
return 0;
}
```
在上述示例代码中,函数foo内部修改了形参p的值,但是不会影响实参p指向的内存地址。因此,输出结果为1。
扫码领取最新备考资料