《C语言程序设计进阶教程》一2.4 可见度-阿里云开发者社区

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

《C语言程序设计进阶教程》一2.4 可见度

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

2.4 可见度

本文讲的是C语言程序设计进阶教程一2.4 可见度,每当一个函数被调用的时候,一个新的栈帧就被压入调用栈。函数只能看到它自己的栈帧。考虑下面的两个例子:
screenshot
screenshot
这两个程序是完全相同的。把f1中的实参k和m重新命名为a和b不会起任何作用。调用栈是怎样的呢?以下是在第一个例子中当f1被调用时的调用栈:
screenshot
第二个例子中的调用栈是相同的,只是栈帧f1中的实参有了不同的标志符而已。要注意地址是相同的。第二个例子强调了在f1中的a和b与f2中的a和b指代的是不同的地址–值对。下面是调用栈:
screenshot
f1栈帧中的a和f2栈帧中的a没有任何关系。将a重命名为k对程序的行为不会造成什么不同。同样的规则也适用于b。要记住计算机不知道标志符。计算机只是使用地址和值。标志符只是对读代码的人有用,当程序被编译成机器可读格式的时候就被舍弃了。
这可能在学生中会造成困惑。凭直觉来看,似乎f1栈帧中的a和f2栈帧中的a是相关的。事实上,它们在栈内存中占据着不同的位置且是不相关的。下面的例子提供了进一步的解释:
screenshot
screenshot
下表显示的是当程序已经输入f1但是还未执行第3行时的栈内存:
screenshot
在第3行被执行之后,调用栈将会像下表中那样。注意函数f1只是修改在它的栈帧中的变量a,因为一个函数只能看见它自己栈帧中的实参和变量。
screenshot
下表显示了在程序运行第4行之后的栈内存:
screenshot
函数f1返回a+b,即17+4=21。值21被写入在地址102(即值地址)的值。在f1返回之后,栈内存如下:
栈帧 标志符 地址 值
screenshot
注意在f2中a和b的值没有改变。
虽然相同的标志符可能会出现在不同的栈帧中,但同样的名字却不能在相同的栈帧中被定义两次。下面的程序是无效的,因为a在一个函数中被同时用作实参和局部变量:
screenshot
回顾一下,本章解释了栈内存的概念,它在函数被调用时会用到。栈内存为每一个函数存储返回位置、值地址、实参和局部变量。

原文标题:C语言程序设计进阶教程一2.4 可见度

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

相关文章
Linux下搭建简易的HTTP服务器完成图片显示
这篇文章作为Linux下socket(TCP)网络编程的练习,使用C语言代码搭建一个简单的HTTP服务器,完成与浏览器之间的交互,最终在浏览器上显示一张图片;通过这个例子可以巩固socket里多线程使用,也可以方便学习了解HTTP协议。
4 0
各种语言里获取当前模块的方法:ABAP,ABSL,C,nodejs
各种语言里获取当前模块的方法:ABAP,ABSL,C,nodejs
6 0
ECS使用体验
云服务器(ECS),是一种简单高效,处理能力可以弹性伸缩的计算服务。
4 0
configure:3855: gcc -V >&5 gcc: error: unrecognized command line option '-V'
configure:3855: gcc -V >&5 gcc: error: unrecognized command line option '-V'
4 0
solr查询 - 标准查询分析器
标准查询分析器的主要优势在于它支持强大且直观的语法,允许创建各种结构化的查询。与DisMax查询分析器相比,最大的缺点是它不能够容忍语法错误,而DisMax查询分析器比设计为尽可能少的返回错误。
4 0
C语言-基本数据类型与位运算
这篇文章作为基础知识点,总结C语言的基本数据类型有哪些,浮点数的精度,整数变量的空间范围,变量定义语法,变量命名规则,浮点数打印格式,基本数据类型printf对应的打印、位运算的知识点。
3 0
MapReduce实现矩阵乘法
矩阵乘法要求左矩阵的列数与右矩阵的行数相等,m×n的矩阵A,与n×p的矩阵B相乘,结果为m×p的矩阵C。详细内容可以查看:矩阵乘法。
5 0
C语言-数组
C语言的数组是一个同类型数据的集合,主要用来存储一堆同类型的数据。 程序里怎么区分是数组?` [ ]` 这个括号是数组专用的符号. 定义数组、 访问数组数据都会用到。
5 0
Java注释总结
 一般说来,遇到前两种的比较幸运,至少通过浏览一遍代码,就能知道需要修改哪些地方,如何修改。但遇到后两种情况,尤其第4种情况,绝对是云里雾里,极有可能自己重新写了。
7 0
linux awk命令详解
awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
5 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载