聊聊函数传值叭——形参与实参的相互影响

本文详细介绍了C++中函数参数的三种传递方式:按值传递、按地址传递(包括指针变量和数组名传递)以及引用传递。通过实例代码解释了每种传递方式的工作原理及其对实参的影响,强调了指针和引用在传递过程中的区别,以及数组名在传递时代表首元素地址的特点。
摘要由CSDN通过智能技术生成

一、函数传值的分类:

二、按值传:

代码:

#include<iostream>
using namespace std;
//定义参数传递的函数
void sump(int m,int n){
    int t;
    t=m;
    m=n;
    n=t;
}
int main(){
    int a,b;
    cin>>a>>b;
    sump(a,b);
    cout<<a<<","<<b<<endl;
    return 0;
}

解释:按值传递的话只是传递了值,当调用的函数sump()结束后,m,n就会自动销毁,不会影响主函数中的a,b的值。

三、按地址传

1、指针变量传:

代码:

#include<iostream>
using namespace std;
//定义参数传递的函数
void sump(int *m,int *n){
    int t;
    t=*m;
    *m=*n;
    *n=t;
}
int main(){
    int a,b;
   //定义两个指针变量
    int *p1,*p2;
    a=3;b=5
    p1=&a;
    p2=&b;
    sump(p1,p2);
    cout<<a<<","<<b<<endl;
    return 0;
}

解释:

扩充:当定义了一个指针变量*p时。在引用的时候,用p代表的是该指针,而*p代表的是该指针所指向的内容

如图:

 总结:当用指针变量传递参数时。有两种情况:1、交换指针所指向的内容,这时实参a,b的值会发生改变。2、交换指针,这时实参a,b的值不会发生改变。上面是交换指针所指向的内容。下面的例子1-1是交换指针。注意两者的区别。、

代码:

例1-1:

#include<iostream>
using namespace std;
//定义参数传递的函数
void sump(int *m,int *n){
    int *t;
    t=m;
    m=n;
    n=t;
}
int main(){
    int a,b;
   //定义两个指针变量
    int *p1,*p2;
    a=3;b=5
    p1=&a;
    p2=&b;
    sump(p1,p2);
    cout<<a<<","<<b<<endl;
    return 0;
}

解释:与上面的不同之处就是把sump()函数中的中间变量t的类型改为了指针类型。这样交换的是m,n两个指针。a,b的值不受影响。意思就是原来m指针是指的a的地址,n指针指的是b的地址。经过交换,m指针指向b的地址,n的指针指向a的地址。a,b里面的值不变。改变的是外边指向他们的指针。

如图:

 2、数组名传

代码:

#include<iostream>
using namespace std;

void sump(char b[]){//这里b[]可以写成*b
    b[]="world";
}
int main(){
    char arry[5]="hello";
    sump(arry);
    for(int i =0;i<=arry.length;i++){
    cout<<arry[i]<<endl;
   }
    return 0;
}

解释:每个数组的数组名代表的就是第一个元素的地址。用数组名去传递相当于把数组的第一个元素的地址传了过去。有了第一个元素的地址,就可以找到该数组的其他元素,相当于找到了该数组。然后形参对数组的改变会直接映射到实参中,即形参改变数组的值,实参中数组的值也会改变。

3、引用类型传

引用类型是什么?

引用类型就相当于是给引用的参数起了一个别名。用这个别名去引用这个参数。它不产生副本,与原参数用的是一块地址空间。而一般的变量是产生了副本,是用的两块地址空间。引用类型传参给指针变量传参一样。形参改变变量会影响到实参中。

代码:

#include<iostream>
using namespace std;
int main(){
    int i = 0;
    int &j = i;
    cout<<j<<i<<endl;
    return 0;
}

解释:当i的值发生改变时,j的值也会发生改变。两者用的是同一块储存空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值