值传递、指针传递和引用传递
值传递、指针传递和引用传递
要理解值传递、指针传递和引用传递的区别,主要要理解函数的实参和形参,函数的作用域(自动变量、栈),内存的布局以及指针和引用的特点。这里不再赘述,可以去看看C++ Primer中的函数那一章节,这里主要总结三种参数传递方式使用的主要场合。
- 值传递:只给函数提供输入值,需要复制开销,大对象很少使用值传递。
- 指针传递:可以改变指针指向内容的值,但是不能改变指针本身,无需复制开销。如果需要改变指针本身,可以使用二重指针或者指针引用。
- 引用传递:除了提供输入值外,还返回操作结果,无需复制开销。
#include<stdlib.h>
//值传递,函数体内变量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;
}
//值传递,函数体内变量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;
}
#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;
}