c++之函数参数传递

c++之函数参数传递

普通数值传递

过程:

  1. 首先计算出实参表达式的值
  2. 然后给形参变量分配一个存储空间,该空间大小等于形参类型的
  3. 将实参表达式的值存入形参变量分配的存储空间中,成为形参变量的初值
    使用这种方式,形参得值得改变不会影响实参的值。这是因为在值传递的过程中,形参是作为被调函数的局部变量处理,在堆栈中开辟空间存放传递进来的实参值,形成了实参的一个副本。全程有形参的值,实参的值。
void fun(int a) {
	a++;
	cout << "形参的地址" << &a << endl;
	a++;
	cout << "形参的地址" << &a << endl;
}
int main()
{
	int a = 3;
	fun(a);
	cout << "实参的地址" << &a << endl;
	cout << "a="<<a << endl;
	return 0;
}

在这里插入图片描述

指针传递

本质上是值传递,但是此时传递的是实参的存储地址,所以传递之后形参和实参都指向同一个对象,因此对形参指针指向的内容的任何改变都会影响到实参指向的内容,其他形参指针和实参指针指向的是同一块内存。但是形参指针的改变并没有影响实参指针本身的改变,影响的只是指针指向的内容。全程有实参的地址(2份,包括形参表示的同样的地址),实参的值。

void fun(int *a) {
	(*a)++;
	cout << "形参的地址" << a << endl;
	a++;
	cout << "形参的地址" << a << endl;
}
int main()
{
	int a = 3;
	fun(&a);
	cout << "实参的地址" << &a << endl;
	cout << "a="<<a << endl;
	return 0;
}

在这里插入图片描述

引用传递

引用是和对象绑在一起的东西,是对象的别名,将引用作为参数,可以使得对形参的任何操作都作用于传递来的实参身上,因为他俩是同一个东西,只是名字不同罢了。在引用传递过程中,同样也是形参会作为局部变量在堆栈中开辟内存空间,但是这时存放的是实参变量的地址(区别于指针传递拷贝了指针的值)因为是引用,形参并没有单独的占用内存资源。这时对形参的任何造作都被处理成间接寻址,即通过堆栈中存方的地址访问主函数中的实参变量。全程只有实参的值和实参的地址。

void fun(int &a) {
	a++;
	cout << "形参的地址" << &a << endl;
	a++;
	cout << "形参的地址" << &a << endl;
}
int main()
{
	int a = 3;
	fun(a);
	cout << "实参的地址" << &a << endl;
	cout << "a="<<a << endl;
	return 0;
}

在这里插入图片描述
总结区别:

  1. 普通数值传递不能通过形参的改变来改变实参的值
  2. 指针能根据形参中指针指向的内容的改变来改变实参的值,但是二者的指针本身的值还是不同的
  3. 引用不仅能够通过形参的改变来改变实参的值,而且只是实参占用了一份内存资源罢了,所以在C++中参数传递首选引用参数传递。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值