C语言学习笔记——学习指针对函数形参实参的传递作用

        接昨天的学习,今日继续。首先感谢给我点赞收藏的盆友!昨天去了华强北转了一圈,人还挺多。由于我个人体态不好,肩颈和腰都有问题,所以提醒大家平时要多注意自己的生活习惯和日常体态。好的身体对于我们开发人员来说更加重要,也建议大家坐一两个小时就起来走走,活动一下身体,这对身体很有好处。好的接下来就进行今日的学习啦!

代码如下:

#include "pch.h"
#include "stdio.h"
using namespace winrt;
using namespace Windows::Foundation;
// 把a和b的值互换
void swap(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}

int main()
{
    int a, b;
    int* pointer_1,* pointer_2;
    scanf("%d,%d",&a,&b);
    pointer_1 = &a, pointer_2 = &b;
    if (a < b)
    {
        swap(*pointer_1, *pointer_2);
    }
    printf("%d,%d\n",a,b);
    return 0;
}

输出结果:

可以看出我调用了转换函数swap,但结果并没有转换成功!这是为什么呢?接下来让我们一起学习吧!

  • 首先我在主程序中定义了两个整形变量a,b.和整形指针变量pointer_1,pointer_2;
  • 使用scanf函数输入a和b的值
  • 然后用pointer_1去取a的地址;pointer_2去取b的地址
  • 当输入的a的值小于b时调用swap函数
  • 然后打印a,b的值

在理解为什么没有成功转换之前,首先让我们理解一下什么是形参和实参

函数的参数:函数的参数分为形参实参两种。

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是做数据传送。发生函数调用时,主调函数把实参的值传递给被调函数的形参从而实现主调函数向被调函数的数据传送。

函数的形参和实参具有一下特点:

  1. 形参只有在被调用的时候才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,型参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
  2. 实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传递给形参。因此应预先用赋值,输入等办法使实参获得确认值。
  3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生“类型不匹配”的错误
  4. 函数调用中发生的数据传送是单向的。即只能把实参的值传递给形参,而不能把形参的值反向地传递给实参。因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

那么在C语言中,主程序里定义的变量,指针等,属于形参还是实参呢?

带着这个问题,我来搜索一下

结果很明显,属于实参

所以我输入的两个实参ab,把实参的值传递给swap,由于swap中是形参,运行完被释放掉,对形参的修改不会影响到实参,除非是通过指针传递!!!这样可以实现对实参的间接修改

这就是为什么以下程序可以实现值大小互换的原因!

#include "pch.h"
#include "stdio.h"
using namespace winrt;
using namespace Windows::Foundation;
// 把a和b的值互换
void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
    int a, b;
    int* pointer_1,* pointer_2;
    scanf("%d,%d",&a,&b);
    pointer_1 = &a, pointer_2 = &b;
    if (a < b)
    {
        swap(pointer_1, pointer_2);
    }
    printf("%d,%d\n",a,b);
    return 0;
}

好的,今天的学习暂时到此结束。如果你觉得对你有帮助,可以给我点赞,收藏加关注,这将会给我巨大的鼓励和支持,希望我们一起进步,共同学习成长,一起勇敢面对生活中的各种挑战!最后祝你我生活愉快!嘻嘻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颈部者

感谢您对我的支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值