C/C++中函数参数传递

C/C++中函数参数传递

C或C++中函数的参数传递包括:值传递、指针传递、引用传递这三种方法。

以经典的交换两个整数为例:

问题描述:

输入描述:两个待交换的整数。

程序输出:交换后的两个整数。

值传递

#include<stdio.h>
void myswap(int x, int y)
{
    int t;
    t=x;
    x=y;
    y=t;
}
int main()
{
    int a, b;
    printf("请输入待交换的两个整数:");
    scanf("%d %d", &a, &b);
    myswap(a,b);  //作为对比,直接交换两个整数,显然不行
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

指针传递

#include<stdio.h>
//指针传递,函数体内只有指针值的变化
void myswap(int *p1, int *p2)
{
    int  t;
    t=*p1;
    *p1=*p2;
    *p2=t;
}

//指针传递,函数体内只有指针的变化
void myswap2(int *p1,int *p2)
{
    int *temp;
    temp=p1;
    p1=p2;
    p2=temp;
}

int main()
{
    int a, b;
    printf("请输入待交换的两个整数:");
    scanf("%d %d", &a, &b);
    myswap(&a,&b);  //交换两个整数的地址
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

引用传递

#include<stdio.h>
void myswap(int &x, int &y) //这里的形参为引用类型,引用与实参进行绑定,作为实参的别名
{                           //所以,使用引用类型,传入实参后,函数对引用的操作,
    int t;                  //就是对实参的操作,所以实参会发生变化                
    t=x;
    x=y;
    y=t;
}
 
int main()
{
    int a, b;
    printf("请输入待交换的两个整数:");
    scanf("%d %d", &a, &b);
    myswap(a,b);  //直接以变量a和b作为实参交换
    printf("调用交换函数后的结果是:%d 和 %d\n", a, b);
    return 0;
}

输出结果

值传递:

​ 输入:2 3

​ 输出:2 3

指针传递:

​ 输入:2 3

​ 输出:3 2

引用传递:

​ 输入:2 3

​ 输出:3 2

总结

在第一个程序中,传值不成功的原因是指在形参(x、y)上改变了数值,没有在实参(a、b)上改变数值。

值传递:值传递传递的是实际参数的一个副本,只是将输入a、b的值拷贝给了x、y,然而交换函数对x、y的操作只是对临时分配的栈中内容进行操作,函数执行完后形参就消失,对实际a、b不产生影响。

在第二个程序中,传地址成功的原因利用指针改变了原来的地址,所以实参就交换了。

指针传递:将形参指针p1、p2指向a、b的地址,交换函数是将指针指向地址中的值进行交换,而不是交换p1、p2指向的地址,因此第二个程序中,第一个交换函数可以实现a、b值交换,第二个交换函数无法实现a、b值的交换。

在第三个程序中,引用是直接改变两个实参变量a,b的值,所以就交换了。这里的形参为引用类型,引用与实参进行绑定,作为实参的别名。所以,使用引用类型,传入实参后,函数对引用的操作,就是对实参的操作,所以实参会发生变化。

引用传递:引用传递时,对形参的操作等同于对实参的操作,即传递的不会是实参的副本,而就是实参。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值