C/C++在函数传参时究竟发生了什么?

无论是值传递,指针传递,引用传递其实都是发生了一次赋值;不同的在于传递的数据类型不同而已;

首先分析“赋值”也就是 “=”的意义

    我们分析下以下代码

1 void test(){
2	int a;
3	int b =10;
4   a = b;
5   int c = b;
6   }

    在代码执行到方法内部的时候就为改方法内的所有局部变量分配了空间(Java则是执行到了才申请空间,这点很不同),

而无论是对  a, b,c的初始化,赋值;只要是使用了 “=”就是将一个值放在变量的所占用的空间中;无论这个变量是指针,还是引用;而变量名就是这个地址的一个名字;

1、值传递

 void test2(int p, int q) {
	p=11;
    q=22;
}

int main()
{
     int ma =10, mb =20;
	test2(ma,mb);
}

在执行test2(ma,mb);时传参其实是   做了一件事,int p = ma;int q = mb;将ma,mb的值赋给p,q;准确的说是将ma,mb这个变量所代表地址中装的东西拷贝到p,q所代表的地址中;

所以以上代码等价于


int main()
{
    int ma =10, mb =20;
	
    int p = ma;
    int q = mb;
    p=11;
    q=22;

    printf("ma = %d",ma);//10
    printf("mb = %d",mb);//20
}

2、指针传递

     那么把值传递的想法放到指针传递中是否成立呢?

     答案是成立!!

//指针传递验证
void test3(int* p, int* q) {
	*p = 11;
	*q = 22;
}

int main()
{
	int ma = 10;
	int mb = 20;
	int* mtemp = &ma;
	test3(mtemp, &mb);
	printf("ma = %d\n ", ma);//11
	printf("mb = %d\n ", mb);//12
}

说白呢就是做了 int* p =mtemp; int* q = &mb;而 “=” 其实就是将变量中的值,或者一个立即数赋给左边;

同理以上代码等价于

//指针传递验证
int main()
{
	int ma = 10;
	int mb = 20;
	int* mtemp = &ma;

    int* p =mtemp; 
    int* q = &mb;
    p=11;
    q=12;

	printf("ma = %d\n ", ma);//11
	printf("mb = %d\n ", mb);//12
}

3、引用传递

     那么把以上想法放到想法放到引用传递中是否成立呢?

     答案是成立!!

void test4(int &p, int&q) {
	p = 11;
	q = 22;
}

int main()
{
	int a = 10;
	int b = 20;
	test4(a,b);
	cout << "a=" << a << endl;
	cout << "b=" << b << endl;
}

依然能够使用 int& p =a; int& q = b;解释;

上面的代码等价于

int main()
{
	int a = 10;
	int b = 20;

    int& p = a; 
    int& q = b
    p = 11;
	q = 22;

	cout << "a=" << a << endl;//11
	cout << "b=" << b << endl;//22
}

 

所以传参的过程中其实就是发生了一次赋值,讲什么立即数,深拷贝浅拷贝把人都绕晕了;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值