C++函数传参、传地址、传引用的简单区分
传值
参数传进来之后只是一个局部变量,修改形参的值不会改变实参的值,也就是在函数里面改变该参数并不会改变主函数里面该变量的值。
且函数内外数值的地址也是不一样的,传入的参数是在新的内存里,二者相对独立
#include <iostream>
void x(int n)
{
n=n+1;
std::cout<<n<<" ";
}
int main(void)
{
int b=0;
x(b);
std::cout<<b;
return 0;
}
这里输出为1 0;
而如果函数传入的带“&”,则输出1 1;
详见下面传引用的分析
传指针
传进来的是地址
修改传入形参不能修改实参,即修改指针内的地址不能修改函数外该指针所存放的地址。
传引用
当传递参数为引用(&)时,形参的修改会导致实参改变,即可在函数内部修改传入参数来修改外部的值。
注意函数传参时 “&” 这个符号的使用,在函数内给结构体赋值等操作,少了取地址符会导致传参失败;(要和传值相区分,很容易出错)
代码如下:
#include <iostream>
void x(int &n)//这里输出1 1
{
n=n+1;
std::cout<<n<<" ";
}
int main(void)
{
int *a;
int b=0;
a=&b;
x(b);
std::cout<<*a;
return 0;
}
函数传入的参数带&时输出1 1//即修改了外部参数
不带&时输出1 0//即未修改外部参数
注:传指针和引用的不同:
指针参数传递本质上是值传递,它所传递的是一个地址值。值传递过程中,被调函数的形参作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)。值传递的特点是,被调函数对形参的任何操作都是作为局部变量进行的,不会影响主调函数的实参变量的值(形参指针变了,实参指针不会变)。
引用参数传递过程中,被调函数的形参也作为局部变量在栈中开辟了内存空间,但此时存放的是由主调函数放进来的实参变量的地址。被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量(根据别名找到主调函数中的本体)。因此特点,被调函数对形参的任何操作都会影响主调函数中的实参变量。
【注:】指针与引用的另一个重要的不同是指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变。