以两数交换情况为例:
1、传值:值的类型为int
#include "stdafx.h"
#include "iostream"
using namespace std;
void swap(int i, int j) {
cout << "i的地址为:" << &i << "\t" << "j的地址为:" << &j << endl;
int temp;
temp = i;
i = j;
j = temp;
}
int main() {
int a = 1, b = 2;
cout << "a的地址为:" << &a << "\t" << "b的地址为:" << &b << endl;
cout << "交换前a和b的值分别为:" << a << "\t\t" << b << endl;
swap(a, b);
cout << "交换后a和b的值分别为:" << a << "\t\t" << b << endl;
return 0;
}
执行结果如下:
可见上述的写法a和b的值并未交换,因为swap(int i,int j)函数,为形参i和j新开辟了 003AF8CC和003AF8D0的地址,交换的数据只是这两个地址上的值,与实参a、b无关,所以a、和b的值未交换。
2、传值、值的类型为地址和引用:
#include "stdafx.h"
#include "iostream"
using namespace std;
//传值,值的类型为地址
void swap(int *i, int *j) {
int p;
cout << "i和j的地址 :" << &i << "\t\t" << &j << endl;
cout << "i和j的存的值:" << i << "\t\t" << j << endl;
p = *i;
*i = *j;
*j = p;
}
//传值,值的类型为引用
void swap1(int& e, int& f) { //引用就是对象的别名,传引用和传对象,没什么区别
int temp;
cout << "e和f的地址:" << &e << "\t\t" << &f << endl;
temp = e;
e = f;
f = temp;
}
int main()
{
int a = 1, b = 2;
cout << "传值,值的类型为地址" << endl;
cout << "a和b的地址:" << &a << "\t\t" << &b << endl;
cout << "交换前a和b的值 :" << a << "\t\t" << b << endl;
swap(&a, &b);
cout << "交换后a和b的值 :" << a << "\t\t" << b << endl;
int c = 3, d = 4;
cout <<endl<< "传值,值的类型为引用" << endl;
cout << "c和d的地址:" << &c << "\t\t" << &d << endl;
cout << "交换前c和d的值 :" << c << "\t\t" << d << endl;
swap1(c, d);
cout << "交换后c和d的值 :" << c << "\t\t" << d << endl;
return 0;
}
2.1 传值,值的类型为地址:
当传值的类型为地址时,执行swap1(int *i,int *j),新开辟内存空间分别为“004FF6A8”和“004FF6AC”,i和j的类型为int *;此时i和j的值为"004FF7C0"和“004FF7B4”,可见i、j的值分别对应着a和b的地址,这就是我们平时所说的“传地址”情况。*i即为:i存的地址值所对应的“值”,同理*j;所以这种操作a和b进行了交换。
2..2 传值,值的类型为引用:
当传值的类型为引用时(C++区别于C的特性),可见swap2(int &e,int &f),形参e和实参c的地址相同,则对形参e的操作,同时就对c进行了操作;