《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 值地址

相关文章
|
3月前
|
数据采集 机器学习/深度学习 自然语言处理
从零训练一个 ChatGPT:用 PyTorch 构建自己的 LLM 模型
本文介绍如何使用PyTorch从零构建类似ChatGPT的大型语言模型,涵盖Transformer架构、数据预处理、训练优化及文本生成全过程,助你掌握LLM核心原理与实现技术。(238字)
461 1
|
2月前
|
人工智能 搜索推荐 机器人
2025年AI智能体来了,企业却还在试水池里扑腾!
88%企业都说用AI了,但大部分还在试点阶段扑腾?AI智能体听起来很酷,实际落地却像让ChatGPT去当总经理。揭秘为什么高效企业用AI搞创新,而不是只盯着省钱。从试点到规模化,这道坎比想象中难跨! #人工智能 #AI智能体 #企业数字化 #创新管理
183 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的高效交互。
892 1
|
11月前
|
人工智能 搜索推荐 API
零门槛、即刻拥有 DeepSeek-R1 满血版
今天来教大家如何用阿里云百炼平台和开源工具 Open WebUI,零门槛(甚至零成本)、即刻拥有 DeepSeek-R1 满血版!全程无需复杂代码,跟着我做就能拥有企业级 AI 服务!我只花了不到半小时就完成了整个服务的部署。
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能:有多少人工,才能有多少智能?
当下AI大模型的能力,特别是Agent领域,到底离不开多少“人工”的加持?本文将结合我的实际经验,深入探讨高质量数据与有效评价体系在Agent发展中的决定性作用,并通过编码Agent、Web Agent和GUI Agent的成熟度分析,揭示AI智能体发展面临的挑战与机遇。
322 89
|
安全 网络协议 Shell
Telnet:简介、工作原理及其优缺点
【8月更文挑战第19天】
2641 0
|
数据采集 搜索推荐 API
小红书笔记详情 API 接口:获取、应用与收益全解析
小红书(RED)是国内领先的生活方式分享平台,汇聚大量用户生成内容(UGC),尤以“种草”笔记闻名。小红书笔记详情API接口为开发者提供了获取笔记详细信息的强大工具,包括标题、内容、图片、点赞数等。通过注册开放平台账号、申请API权限并调用接口,开发者可构建内容分析工具、笔记推荐系统、数据爬虫等应用,提升用户体验和运营效率,创造新的商业模式。本文将详细介绍该API的获取、应用及潜在收益,并附上代码示例。
1815 13
|
机器学习/深度学习 算法
【机器学习】解释对偶的概念及SVM中的对偶算法?(面试回答)
解释了对偶的概念,指出对偶性在优化问题中的重要性,尤其是在强对偶性成立时可以提供主问题的最优下界,并且详细阐述了支持向量机(SVM)中对偶算法的应用,包括如何将原始的最大间隔优化问题转换为对偶问题来求解。
495 2
|
机器学习/深度学习
【Python-Keras】keras.layers.BatchNormalization解析与使用
BatchNormalization是一种用于深度神经网络的规范化方法,通过在每个batch上规范化前一层的激活值,加快模型训练速度,提高稳定性,并减少对初始化权重的敏感性,允许使用更大的学习率。
441 1
|
域名解析 弹性计算 网络协议
DNS问题之域名云解析接口关闭如何解决
DNS解析是指将人类可读的域名转换成机器可读的IP地址的过程,它是互联网访问中不可或缺的一环;本合集将介绍DNS解析的机制、类型和相关问题的解决策略,以确保域名解析的准确性和高效性。
467 1
DNS问题之域名云解析接口关闭如何解决