4.2 函数调用与参数传递

4.2函数调用与参数传递

本章节会介绍一些关于函数调用原理方面的知识。


4.2.1 形参与实参

首先看一下概念。(源于百度知道上的回答)

形参:也被称为“形式参数”,是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。
实参:全称为"实际参数"是在调用时传递给函数的参数,即传递给被调用函数的值。

在这里插入图片描述
按照我的理解上,实参是传递给函数的一个具体的值。形参则是定义出来,用来调用实参的参数。(形参与实参并不一定是一一匹配的,python里面的函数可以添加一些类似于kargs和args一类不一定传递值的参数)

书上在这里介绍了一个常见的错误:

#include <stdio.h>
void swap(int a,int b){
   
	a=a+b;
	b=a-b;
	a=a-b;
}
int main( )
{
   
   int x,y;
   scanf("%d%d",&x,&y);
   swap(x,y);
   printf("%d %d",x,y);
   return 0;
}

这里我们试图去定义一个交换两个数的数值的函数,在函数体编译了某看起来非常帅的一个方法。然后运行一下看看:

在这里插入图片描述

结果显然和我们想象的不一样。这是为什么呢?

事实上,我们调用函数,函数在接收到我们传递的值以后,会根据这个函数函数体的内容在内存去开辟我们需要的空间,或者直接对已经被存储的数据进行操作。当这个函数运行结束的时候,那些在这个函数里面新开辟的空间会被“破坏”。

我们分析一下上面代码里,函数调用的过程:

1.给swap这个函数传递上两个参数
2.给被传递的两个参数分别开出两个新的空间,这两个空间的地址我们记作&a,&b。
3.这个函数将&a和&b这两个地址里的数据进行交换。
4.函数运行结束,破坏这两个空间。

也就是说,实际上我们是做了开辟两个空间,给这两个空间传值,交换这两个值,然后把这两个空间破坏掉的操作。这个操作是无法达到我们需要的结果的。


4.2.2 调用栈

这里介绍了gdb这个命令的一些操作,由于这个功能强大的调试器是在终端上面进行操作的。而我恰好又不太熟练这方面的操作(我是废物),于是便不自己介绍这方面的知识了。有兴趣的请自行参考:

gdb调试的基本用法

事实上用过pycharm的都知道,很多环境是自带图形化的断点调试的。(图形化的东西肯定看起来比较方便啊)


4.2.3 用指针做参数

那我们该如何正确的编译一个swap函数呢?
我们这样进行操作:

void<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值