/*
**test12.cpp : Defines the entry point for the console application.
**系统winXP SP3 32位.
**值传递、指针传递与引用传递
*/
#include "stdafx.h"
void swap1(int x,int y) //值传递1
{
int tmp;
tmp=x;
x=y;
y=tmp;
}
void swap2(int* x, int* y) //值传递2(传递地址,交换地址内存储的数据)
{
printf("swap2-before-----iNum1所在的地址为:%x\n", &x); //12ff24
printf("swap2-before-----iNum2所在的地址为:%x\n", &y); //12ff28
printf("---------------------------\n");
printf("swap2-before-----iNum1存储的值为:%x\n", *x); //1
printf("swap2-before-----iNum2存储的值为:%x\n", *y); //2
printf("---------------------------\n");
int *tmp = NULL;
tmp = x;
x = y;
y = tmp;
//所以交换x,y只是交换了两者存储的值(值为a,b的地址存储的数值),并没有涉及到a,b的值(值为a,b的地址)的交换
//所以只是操作地址并未起到作用
printf("swap2-later-----iNum1存储的值为:%x\n", *x); //2
printf("swap2-later-----iNum2存储的值为:%x\n", *y); //1
printf("swap2-later-----iNum1所在的地址为:%x\n", &x); //12ff24
printf("swap2-later-----iNum2所在的地址为:%x\n", &y); //12ff28
/***************************
我们看到不论传递的是值还是指针(指针也是一个值),
传递给被调用函数的都是函数参数的一个拷贝,
直接对拷贝进行操作不会影响参数本身。
******************************/
printf("---------------------------\n");
}
void swap3(int& x, int& y) //引用传递,也可以改变值,采用const int&
{
int tmp;
//这里使用了*表示操作的是指针x,y所指向变量的内容(即变量a,b的内容)
tmp = x;
x = y;
y = tmp;
}
int main()
{
//值传递1,值不改变
int iNum1 = 1,iNum2 = 2;
printf("before--addr:%x,%x\n",&iNum1,&iNum2); //iNum1地址为 12ff7c,iNum2地址为 12ff78
void swap1(int x,int y);
printf("before:%d,%d\n",iNum1,iNum2); //1,2
swap1(iNum1,iNum2);
printf("swap1-----later:%d,%d\n",iNum1,iNum2); //1,2并未实现交换的结果
printf("swap1-----later:%d,%d\n",iNum1,iNum2); //1,2
//值传递2,值(地址中内容)改变
iNum1 = 1,iNum2 = 2;
printf("---------------------------\n");
printf("swap2-----iNum1所在的地址为:%x\n", &iNum1); //12ff7c
printf("swap2-----iNum2所在的地址为:%x\n", &iNum2); //12ff78
//所以交换x,y只是交换了两者存储的值(值为a,b的地址),并没有涉及到a,b的值的交换
//所以只是操作地址并没有卵用
printf("---------------------------\n");
swap2(&iNum1,&iNum2);
//引用传递,值发生改变
iNum1 = 1,iNum2 = 2;
printf("swap3-----before:%d,%d\n", iNum1, iNum2);//1,2
printf("swap3-before-----iNum1所在的地址为:%x\n", &iNum1); //12ff7c
printf("swap3-before-----iNum2所在的地址为:%x\n", &iNum2); //12ff78
swap3(iNum1,iNum2);
printf("swap3-----later:%d,%d\n", iNum1, iNum2);//2,1值发生改变
printf("swap3-later-----iNum1所在的地址为:%x\n", &iNum1); //12ff7c
printf("swap3-later-----iNum2所在的地址为:%x\n", &iNum2); //12ff78
return 0;
}
Tips:当采用值传递的时候,最好采用const &形式来传递,可增加程序运行效率,因为引用的创建与传递不会调用构造与解析函数。