《C语言程序设计进阶教程》一2.3.4 值地址

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

2.3.4 值地址

本文讲的是C语言程序设计进阶教程一2.3.4 值地址,目前为止,我们所有函数的返回类型都是void,即函数什么都没有返回。函数可以返回值。考虑下面的例子:
screenshot
局部变量u在f2中,所以它是在f2的栈帧中。u的值是未被定义的,因为它还未被赋值。记住C不初始化变量,所以未初始化的变量可以存储任何值(即未占用)。f2的栈帧包含值还未被定义的变量u。
screenshot
u的地址是在f1被调用之前存储在调用栈的。这个地址叫作值地址,因为它是函数f1存储返回值的地址。因此,当f1的栈帧建立之后,就要为值地址再加上一行,它的值是u的地址。
screenshot
当函数f1执行的时候,它把k和m的值加在一起,产生的值为9。数字9之后被写入(即代替)在地址100处的初始未占用的值。在f1结束之后,它的帧出栈,调用栈就会像下面这样:
screenshot
这条规则可以合并到之前的调用栈规则中:
screenshot如果一个函数返回了一个值,这个值就会被写到调用函数栈帧的一个局部变量中。这个变量的地址(叫作值地址)存储在调用栈中。
screenshot如果函数有局部变量,那么局部变量被存储在实参之上。
screenshot如果函数有实参,那么实参是存储在返回位置上的。
screenshot实参和返回位置共同构成了被调用函数的栈帧。
screenshot当一个函数被调用时,这条调用之后的行编号就被压入调用栈。这个行编号就是“返回位置”(RL)。这是在被调用函数结束(即返回)之后程序继续执行的地方。
screenshot如果相同的函数在不同行处被调用,那么每个调用都有一个相应的返回位置(每个函数调用之后的那行)。
screenshot当一个函数结束之后,程序将从存储在调用栈顶部的行编号处继续执行。调用栈顶部的内容就会被弹出。
要注意调用函数(f2)没有被强制去存储被调用函数(f1)的返回值,上例中的第9行可以写作:
screenshot
在这种情况下,函数f1被调用,但是返回值被舍弃了。因为没必要去存储返回值,值地址没有压入调用栈。
关键词return可以出于两种不同的目的被使用:
screenshot如果void位于函数名前面,此函数不返回任何值。单词return使此函数停止,程序从调用函数中的返回地址继续。
screenshot如果函数不是void型,单词return会为在调用栈中由值地址给出的变量赋值。
请记住如果一个函数执行了return声明,在return之后的任何内容都会被忽略且不会被执行。执行return声明会使函数停止,且它的栈帧会出栈。之后程序会从返回地址继续执行。

原文标题:C语言程序设计进阶教程一2.3.4 值地址

相关文章
|
数据采集 DataWorks 数据可视化
数据分析之「数据探查」—帮您快速掌握数据情报
为了帮助用户一眼看穿当前数据的质量、结构、分布、统计信息,Dataworks数据分析系统提供了数据探查这个情报管家。它支持探查概览、支持探查详情、支持数据筛选、支持数据刷新、支持数据分布直方图动态装箱和多级下钻!我们会在电子表格顶部以图形和富文本的形式,智能展示每列数据类型和值分布的概览情况;同时,也支持切换到详细模式,查看更多更全面的数据信息。
5114 0
|
NoSQL 安全 Redis
Redis6.0新特性——ACL(权限控制列表)实现限制用户可执行命令和KEY
Redis6.0新特性——ACL(权限控制列表)实现限制用户可执行命令和KEY
1222 0
|
7月前
|
弹性计算 人工智能 前端开发
2026阿里云轻量应用服务器详解:免费试用、费用价格、200M带宽优势及问题解答FAQ
阿里云轻量应用服务器以38元/年起、200M峰值带宽、开箱即用等优势,成为个人开发者、学生及初创企业的首选。本文详解免费试用、最新价格、带宽优势与FAQ,助你轻松选购。(239字)
|
11月前
|
数据采集 机器学习/深度学习 自然语言处理
从零训练一个 ChatGPT:用 PyTorch 构建自己的 LLM 模型
本文介绍如何使用PyTorch从零构建类似ChatGPT的大型语言模型,涵盖Transformer架构、数据预处理、训练优化及文本生成全过程,助你掌握LLM核心原理与实现技术。(238字)
907 1
|
7月前
|
机器学习/深度学习 人工智能 算法
草莓成熟度目标检测数据集(2000张图片已标注)| YOLO训练数据集 AI视觉检测
本文介绍的 草莓成熟度目标检测数据集(2000张已标注图像),基于多类别草莓成熟度样本构建,覆盖未成熟、成熟和过熟三类典型状态,并采用标准 YOLO标注格式,可直接用于深度学习模型训练,为智慧农业视觉研究和果蔬自动检测系统提供重要的数据支持。
|
10月前
|
人工智能 搜索推荐 机器人
2025年AI智能体来了,企业却还在试水池里扑腾!
88%企业都说用AI了,但大部分还在试点阶段扑腾?AI智能体听起来很酷,实际落地却像让ChatGPT去当总经理。揭秘为什么高效企业用AI搞创新,而不是只盯着省钱。从试点到规模化,这道坎比想象中难跨! #人工智能 #AI智能体 #企业数字化 #创新管理
444 3
|
移动开发 JavaScript 前端开发
HarmonyOS鸿蒙应用开发——探索原生与H5通信框架DSBridge
HarmonyOS版DSBridge是一个桥梁库,允许鸿蒙原生环境与JavaScript交互。它兼容Android和iOS的第三方DSBridge核心功能,支持同步和异步调用、命名空间API管理、进度回调及页面关闭监听等功能。主要特性包括适配鸿蒙NEXT版本、支持串行异步并发任务、兼容DSBridge 2.0与3.0版本JS脚本,并提供类形式集中管理API及自定义页面组件注册。源码仓库:HarmonyOS版 - DSBridge-HarmonyOS。安装命令为`ohpm install @hzw/ohos-dsbridge`。通过该库,开发者可以方便地在鸿蒙系统中实现原生与JS的高效交互。
1217 1
|
安全 网络协议 Shell
Telnet:简介、工作原理及其优缺点
【8月更文挑战第19天】
3214 0
|
人工智能 搜索推荐 API
零门槛、即刻拥有 DeepSeek-R1 满血版
今天来教大家如何用阿里云百炼平台和开源工具 Open WebUI,零门槛(甚至零成本)、即刻拥有 DeepSeek-R1 满血版!全程无需复杂代码,跟着我做就能拥有企业级 AI 服务!我只花了不到半小时就完成了整个服务的部署。
|
传感器 人机交互 vr&ar
VR技术的基本原理与发展历程:探索虚拟现实的无限可能
【8月更文挑战第24天】VR技术作为一项具有广阔前景和巨大潜力的技术,正在不断改变着我们的世界。让我们共同期待VR技术在未来的更多精彩表现吧!
5337 2