您的位置:首页 > 编程语言 > C语言/C++

C++ 值传递 指针传递和引用传递

2015-09-17 17:16 281 查看
java中参数传递只有值传递,与java不同,C++中的参数传递方式有三种,分别是 值传递 指针传递和引用传递,值传递和指针传递都知识传递当前参数的一个副本,而引用传递则是直接传递参数,所以在函数中改变参数的值就会有不同。

1.值传递

void replace(int i)//值传递

{

    i = 10;//改变的是i副本的值

}

执行下面代码

int a = 5;

replace(a);

println(a);

这时候a的值还是5

ps:因为replace函数中的参数传递方式为值传递,实际上是传递的是i的一个副本,并非i本事,函数中改变i的值是改变的i副本的值,并不会影响到a

2.指针传递

void replace(int* i)//指针传递

{

    *i = 10;//改变i所指向的内存

}

执行下面代码

int a = 5;

replace(&a);

println(a);

这时候a的值还是10
ps:replace中参数传递方式是指针传递,它也是和值传递一样,函数内部操作的是指针的副本,只不过这个副本和参数指针i都指向同一块内存块,所以在函数中操作副本指向的内存块就可以修改参数指针i所指向的内存块,a的值由5变10

注意一下代码:

void replace(int* i)//指针传递

{

    int a = 9;

    i = &a;

}
执行下面代码

int* n = NULL;

replace(n);

这时候n的值还是NULL

ps:如上面说的函数replace操作的是i的副本,函数内改变i的值只是改变了i副本的值,不会影响到n的值,所以n依然指向的是NULL

3.引用传递

void replace(int& i)//引用传递

{

    i = 10;//改变实参的值

}

执行下面代码

int a = 5;

replace(a);

println(a);
a的值是10;

ps:引用传递是传递实参本身,函数内操作的就是实参本身,不存在副本,在效率上也高于值传递

在很多程序中会存在以下代码:

bool sum(const int &a,const int &b);

这种参数一是限定了a和b的值在函数中不能被改变,二是省去了a,b拷贝副本的过程,如果a和b是比较大的类而不是基本数据类型效率会比较高
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息