C++参数传递

在C++中,参数传递的方式是“实虚结合”。

  • 按值传递(pass by value)

  • 地址传递(pass by pointer)

  • 引用传递(pass by reference)

1.按值传递

  • 在按值传递中,函数参数是通过将其值复制给形式参数(函数内部的参数)来传递的。

  • 这意味着在函数内部对参数的任何修改都不会影响函数外部的原始值。

  • 按值传递适用于不需要修改原始值的情况,或者需要在函数内部创建局部副本以避免影响原始值的情况。

void modifyValue(int x) {
x = 42;
}

int main() {
int value = 10;
modifyValue(value); // value的值不会改变
return 0;
}

2.引用传递

  • 在引用传递中,函数参数是通过传递它们的引用(或指针)来传递的,这意味着函数内部可以直接访问和修改原始值。

  • 这允许函数对原始数据进行修改,而不需要创建副本。

  • 按引用传递通常用于需要修改原始值或避免创建副本的情况。

void modifyValue(int& x) {
x = 42;
}

int main() {
int value = 10;
modifyValue(value); // value的值被修改为42
return 0;
}

3.传址调用(传指针)

一级指针做参数

void func_2(int * a)
{
*a = 10;
}
int a = 1;
func_2(&a);
  • 函数接受一个值,这个值是地址,谁的地址?外部变量 a 的地址,函数创建一个临时变量(指针类型)来存储外部变量 a 的地址

  • 在函数内部使用临时变量 a 可得到外部变量 a 的地址,使用 *a 可以获取外部变量 a 地址中所存储的值

  • 这个临时变量 a 复制的是外部变量的地址,按值传递,无论怎么复制,地址是唯一的,通过地址来修改外部变量的值是可以实现的

改变指针指向?

void func_2(int * a)
{
a=NULL;//让指针指向空
}
int a = 10;
int *b = &a; //这个b存储的是变量a的地址
func_2(b); //要修改b的指向,看似可以修改,其实不可以,注意我说的是指向。

  • 函数创建临时变量a存储b的值,也就是变量a的地址;

  • 给变量a赋值为空,结果只是临时变量a被修改了值,而原外部变量b的值还是指向外部变量a的地址;

  • 所以该函数实现不了预期的功能。

二级指针做参数

void func_3(int ** a)
{
*a = NULL;
}
int a = 10;
int *b = &a;
int ** c = &b;
func_3(c);
  • 函数创建一个临时变量 a 来存储 c 的值,即 b 的地址。

  • 函数内部使用 *a 获取外部变量 b 存储的地址,从而可以修改 b 指针的指向。

  • 通过 **a 可以访问外部变量 a 的值,并对其进行修改。

总结

  1. 如果想要修改指针指向变量的值,则无需传入高一级的指针,使用同级指针即可;

  2. 如果想要修改指针本身的值,也就是地址,则应使用比原指针高一级的指针来实现。

Reference

[1] C/C++什么时候使用二级指针,你知道吗?: https://cloud.tencent.com/developer/article/1732047

------------------------------- 本文结束啦❤感谢您阅读-------------------------------
赞赏一杯咖啡