c++传值,值的类型分别为地址和引用

   以两数交换情况为例:

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进行了操作;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值