《C语言程序设计进阶教程》一2.3.2 函数实参-阿里云开发者社区

开发者社区> 华章计算机> 正文

《C语言程序设计进阶教程》一2.3.2 函数实参

简介: 本文讲的是C语言程序设计进阶教程一2.3.2 函数实参,本节书摘来华章计算机《C语言程序设计进阶教程》一书中的第2章,第2.3.2节, Intermediate C Programming[美] 陆永祥(Yung-Hsiang Lu) 著 徐东 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
+关注继续查看

2.3.2 函数实参

本文讲的是C语言程序设计进阶教程一2.3.2 函数实参,为了理解函数实参,我们必须对目前见到的十分简单的例子进行详细叙述。首先,大多数函数引入输入实参,具有返回值。《韦氏词典》将argument(实参)定义为“可以决定一个函数的值的自变量中的一个”。对于一个数学函数,例如f(x、y、z),变量x、y、z就是函数f的实参。在C程序中,函数有相似的语法。考虑下面的例子:
screenshot
输入a、b、c是f1的实参。当f1被调用的时候,f2必须提供3个实参,而且这些信息被压入调用栈。调用栈存储着这些实参和它们在返回位置上的值。
screenshot
我们已经知道在一个计算机程序中没有标志符。相反,正如之前讨论过的,计算机内存只有地址和值。因此,上面的表要加上一列以显示地址的信息。每个值都有唯一的地址——实参存储在计算机电路中不同的物理部分——这个性质是由操作系统和硬件部分来保证的。程序员不能控制所使用的具体地址。地址在不同类型的计算机上会有很大的变化。本书使用100,101,……表示这些地址。按照惯例,地址从底部的一个小数字开始向上增长。
screenshot
返回位置和实参共同构成了被调用函数f1的栈帧。一个栈帧占据着内存中一个连续的内存块。上面的表现在可以扩展成可以展示出标志符、地址和它们的值的这样一个栈帧。
screenshot
当又有一个函数调用的时候会发生什么呢?考虑下面的例子:
screenshot
函数f3调用f2,所以f2的栈帧被压入了调用栈。实参a的值是5,因为它是在第15行f3调用f2时赋给a的值。相似地,实参b的值是-17,因为它是在第15行f3调用f2时赋给b的值。
screenshot
函数f2调用f1,f1的栈帧被压入调用栈。实参t的值是22,因为它是第8行a-b的值。相似地,实参u的值是-12,因为它是第8行a+b的值。
screenshot
请记住栈帧和标志符只是对人类而言的。计算机不会明白什么是栈帧和标志符。相反,它们只是处理地址和值。在2.3.1节中,我们列出了调用栈的规则,现在我们再加上一些:
screenshot如果函数有实参,那么实参是存储在返回位置之上的。
screenshot实参和返回位置共同构成了被调用函数的栈帧。
screenshot当一个函数被调用时,这条调用之后的行编号就被压入调用栈。这个行编号就是“返回位置”(RL)。这是在被调用函数结束(即返回)之后程序继续执行的地方。
screenshot如果相同的函数在不同行处被调用,那么每个调用都有一个相应的返回位置(每个函数调用之后的那行)。
screenshot当一个函数结束之后,程序将从存储在调用栈顶部的行编号处继续执行。调用栈顶部的内容就会被弹出。

原文标题:C语言程序设计进阶教程一2.3.2 函数实参

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ECS进阶第五天
搭建个人Leanote云笔记本
192 0
《例说8051:单片机程序设计案例教程》——导读
从8048开始,“单片机”即成为广受欢迎的代名词,8051更成为电机、电子类专业必修的课程。当然,应用单片机制作电子系统项目,既简单又经济实惠,早已成为学生的最爱。在电路设计方面,需求量较大、电路较复杂的系统可采用为客户专用而设计的IC(即ASIC),如芯片组、控制芯片等,虽然ASIC的单位成本不高,但总体成本很高、开发时间也比较长。
834 0
linux strace-跟踪进程的系统调用或是信号产生情况,lstrace-跟踪己丑年调用库函数情况,进程跟踪调试命令
本工具可以用来做大多数排除,比如mount一个NFS,很慢,找不出原因,我们可以使用strace命令来跟中mount这个经常所有的调用过程。 strace 命令是一种强大的工具,它能够显示所有由用户空间程序发出的系统调用。
1348 0
VB编程:利用CallByName函数对对象进行操作
VB编程:利用CallByName函数对对象进行操作
4 0
Linux下C编程,子进程创建函数fork() 执行解析
最近在看进程间的通信,看到了fork()函数,虽然以前用过,这次经过思考加深了理解。现总结如下: 1.函数本身   (1)头文件   #include  #include   (2)函数原型   pid_t fork( void);  (pid_t 是一个宏定义,其实质是int 被定义在#include中)  返回值: 若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1   (3)函数说明   一个现有进程可以调用fork函数创建一个新进程。
632 0
《C语言程序设计进阶教程》一1.1 编译
本文讲的是C语言程序设计进阶教程一1.1 编译,本节书摘来华章计算机《C语言程序设计进阶教程》一书中的第1章,第1.1节, Intermediate C Programming[美] 陆永祥(Yung-Hsiang Lu) 著 徐东 译 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2116 0
xcode反汇编调试iOS模拟器程序(三)查看Objective-C函数与参数
在Objective-C函数的入口处(第一行)加断点,可用esp指针来探查参数。 以esp为基址,往后的偏移分别是: 0:函数执行完毕后的返回地址(不是返回值的地址哦) 4:对象实例的指针,即self指针 8:selector,实际是一个...
973 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载