值传递,指针传递;引用传递(c++独有)本质
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值传递,指针传递;引用传递(c++独有)本质相关的知识,希望对你有一定的参考价值。
要理解值传递、指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量、栈),内存的布局以及指针和引用的特点。这里主要总结三种参数传递方式使用的主要场合。
- 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递。
- 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销。如果需要改变指针本身,可以使用二重指针或者指针引用。
- 引用传递:除了提供输入值外,还返回操作结果,无需复制开销。
//值传递,函数体内变量n是参数n的一份拷贝,函数体内改变n的值不会改变外面的n
void addTenByVal(int n)
{
n = n + 10;
return;
}
//指针传递,n是指向外部变量的指针,改变*n的值,也会改变外面变量的
void addTenByPtr(int *n)
{
*n = *n + 10;
return;
}
//引用传递,别名引用,牵一发而动全身
void addTenByRef(int &n)
{
n = n + 10;
return;
}
int main(int argc , char *argv[])
{
int n = 10;
printf("值传递前,n=%d\n",n);
//值传递
addTenByVal(n);
printf("值传递后,n=%d\n",n);
printf("指针传递前,n=%d\n",n);
//指针传递
addTenByPtr(&n);
printf("指针传递后,n=%d\n",n);
printf("引用传递前,n=%d\n",n);
//引用传递
addTenByRef(n);
printf("引用传递后,n=%d\n",n);
system("pause");
return 0;
}
后来复习的时候又写了一个DEMO,这个不需要解释,大家都懂的。
#include <stdio.h>
#include <tchar.h>
#include <cstdlib>
#include <iostream>
#include <sys/timeb.h>
#include <ctime>
#include <climits>
using namespace std;
//交换参数-值传递
void SwapByVal(int v1,int v2)
{
int tmp = v2;
v2 = v1;
v1 = tmp;
}
//交换参数-引用传递
void SwapByRef(int &v1,int &v2)
{
int tmp = v2;
v2 = v1;
v1 = tmp;
}
//交换参数-指针传递
void SwapByPtr(int *v1,int *v2)
{
int tmp = *v2;
*v2 = *v1;
*v1 = tmp;
}
int _tmain(int argc, _TCHAR* argv[])
{
//值传递
int a = 10 , b = 20;
cout << "值传递前:a = " << a << " ; b = " << b << endl;
SwapByVal(a,b);
cout << "值传递后:a = " << a << " ; b = " << b << endl;
//复位-引用传递
a = 10 , b = 20;
cout << "引用传递前:a = " << a << " ; b = " << b << endl;
SwapByRef(a,b);
cout << "引用传递后:a = " << a << " ; b = " << b << endl;
//复位-指针传递
a = 10 , b = 20;
cout << "指针传递前:a = " << a << " ; b = " << b << endl;
SwapByPtr(&a,&b);
cout << "指针传递后:a = " << a << " ; b = " << b << endl;
system("pause");
return 0;
}
c++为什么引入引用传递?
指针本身也是一个变量,其值是一个地址,注意这个地址是指针指向变量的地址,不是指针自己变量的地址,所以如果以指针作函数参数,那么形参和实参都是一个地址,都指向同一个变量(被实参指针指向的变量),可以通过这个地址改变被指向变量的值,但若你修改形参指针本身的值,实参指针并不会得到修改,因为实参指针与形参指针是两个不同的变量,占据不同的内存位置,只不过传入参数时使这两个变量具有相同的值(被指向变量的地址)。
所以,如果你想修改一个变量,请传递此变量的地址(指针)。如果你想修改一个指针本身,请传递此指针的地址,也就是指针的指针,即二级指针。
三种引用使用的场景:
以上是关于值传递,指针传递;引用传递(c++独有)本质的主要内容,如果未能解决你的问题,请参考以下文章