开发者社区> 华章计算机> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

《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 可见度

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

相关文章
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
生产者消费者模式保姆级教程 (阻塞队列解除耦合性) 一文帮你从C语言版本到C++ 版本, 从理论到实现 (一文足以)
0 0
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
C语言程序设计教程任务;初步认识C语言,携君之手,步入编程之路。
0 0
0基础C语言自学教程——收官之战——第十四节 文件的编译和链接
这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。
0 0
0基础C语言自学教程——第十三节 文件操作
数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。
0 0
0基础C语言自学保姆教程——第十二节 动态内存分配
在开辟数组的过程中,其必须是一个定长的数组,就是在开辟空间的过程中就要指定大小;并且空间开辟的大小是固定的。
0 0
0基础C语言自学保姆教程——第十一节 自定义类型(结构体、枚举、位段、联合)与预处理指令(#define、#include等)
不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
0 0
0基础C语言自学教程——第十节 字符串函数
源字符串必须以'\0'结束。 会将源字符串中的'\0'拷贝到目标空间。 目标空间必须足够大,以确保能存放源字符串。 目标空间必须可变。
0 0
0基础C语言自学教程——第九节 从底层汇编的角度简单理解函数栈帧的创建和销毁
我们在现在,其实已经比较清楚函数是怎么样运行的了,包括怎样传参 、函数调用等等。但是呢,这样也只是理解到了会用的地步。
0 0
0基础C语言自学教程——第八节 函数指针数组的各种关系
const int* 是指向一个常量整数的指针,所以说,const int*所修饰的指针变量,其指针变量本身(即指向元素的地址)是可以被修改的,但是其指针所指向的值是不允许被修改的。
0 0
0基础C语言自学教程——第七节 初始指针
我们把计算机中的内存看作一条长街上的一排房屋。比如繁华大道上的多少多少号。每个房子可以容纳数据,并通过多少多少号来标识。
0 0
文章
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
Java高级特性入门(二)
立即下载
《给ITer的技术实战进阶课》
立即下载
让学习有效发生
立即下载