交换两个整数(形参和实参的用法) —— C语言

提出问题:

示例:设计一个交换两个整数的算法。

(这个题看似简单,实际上是有一些坑的 ,考察形参和实参的用法,记得当时刚学C时也是踩过这个坑,所以在这里记下来加深一遍印象)

编写一个函数swap1(x,y):

void swap1(int x, int y)
{
    int temp;
    tmp = x;
    x = y;
    y = tmp; //交换形参x和y的值
}

当执行语句swap1(a,b)时, a和b实参值不会发生交换。

分析: x, y 即是输入型参数,也是输出型参数

改正方法1:

采用指针的方式来 回传形参的值,需要把上述函数修改为:

/*
交换形参xy所指向的值
*/
void swap2(int *x, int *y)
{
    int tmp;
    tmp = *x;    //x的值放在tmp中
    *x = *y;     //x所指的值改为*y
    *y = tmp;    //y所指的值改为tmp

}

在调用时,上述函数改为swap2(&a, &b) ——》比较复杂

改正方法2:

采用引用性形参——》将输出型形参改为引用类型。

/*
交换形参x和y的值
*/

void swap(int &x, int &y)
//形参前的“&”符号不是指针运算符  助理需要注意一下
{
    int tmp = x;
    x = y; y = tmp;
}

当执行语句swap(a,b)时,形参和实参的匹配相当于:

int &x = a ; //a为x的引用
int &y = b; //b为y的引用

这样,a与x共享存储空间,b与y共享存储空间,因此执行函数后a和b的值发生了交换——》简单

后续思考

普通的参数值传递

//fun1()

void fun1(int n)
{
    int m =2;
    fun2(m);
    printf("%d\n",m);
}
//fun2()
void fun2(int x)
{
    x++;
    printf("%d\n",x);
}

从实参到形参的单向值传递
fun1(m) ——————————》fun2(x)

引用类型的参数传递

//fun1()

void fun1(int n)
{
    int m =2;
    fun2(m);
    printf("%d\n",m);
}
//fun2()
void fun2(int %x)
{
    x++;
    printf("%d\n",x);
}

从实参到形参的单向值传递
fun1(m) ——————————》fun2(x)
fun1(m) 《—————————— fun2(x)
形参回传给实参,实参和形参同步发生改变

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值