C语言中,可变参数函数调用的过程?!

news2024/10/6 22:24:14

以下是一位同学,发送给我的问题。

如下图,是学生在学习完指针章节后,写的测试代码。

他的疑问是:pa为什么指向a[3]的地址啊?

查看程序的输出后,知道他想问的是:为什么第二个printf语句输出的分别是数组a中第3、2、1个元素的地址,即&a[3],&a[2], &a[3]。这一点可以从下面第三个printf输出结果验证——刚好每个元素地址相隔4个字节。

这是个非常有意思的问题?!知识点涉及可变函数的调用过程(参数传递)、指针的自加自减运算!

(1)可变参数函数的调用过程:可变参数函数调用时,因为参数不可知,因此采用自右到左的入栈规则,如下图所讲!

结合上面的例子,我们知道printf语句三个参数入栈顺序为:++pa, pa++, pa,因为初始pa=a,因此入栈后的值为:

要注意,printf输出时顺序刚好与上面入栈相反(先进后出),因此先输出第1个pa,此时值是&a[2]。然后输出pa++,是先输出再++,也就是入栈时的&a[1];最后才是++pa对应的,这个是最难理解的——入栈时是&a[1],为什么最后输出的是&a[2]?

(2)查询资料后,得知:printf函数确实是从右向左遍历参数,但从右向左遍历时不是遍历一次就打印输出一个参数值,而是走完整个过程,统一打印最后一个值。这解释了上面第一和第三个输出。其中有一个特殊的运算符号,后置++,对于后置++来说,他最终不会返回整体统一返回的值,只会返回当时算到这一步时i对应的初始值(入栈时计算得到的值),这解释了第二个输出。

大家可以运行下面例子,看看你理解了没有?!

最后留一个下面的问题,大家算算下面的输出:

int  i = 1;

printf("%d,%d,%d,%d,%d,%d,%d",i,i++,++i,i++,++i,i++,++i)

参考资料:(66条消息) c语言中printf函数与前置后置++的过程分析_不熬夜不抽烟不喝酒的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/23113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式开发:从C语言成功过渡的3个技巧

当谈到嵌入式系统编程语言时,毫无疑问,C是主导语言。在过去的几十年里,有无数次尝试改变,但当尘埃落定时,C编程语言似乎永远是屹立不倒的语言。近年来,关于用其他语言取代C语言的争论再次出现。无论潜在的篡…

A-Level经济例题解析及练习Analysis of trade

今日知识点:Analysis of trade 例题Without trade, PD $3000, Q 400; in world markets, PW $1500 Under free trade, how many TVs will the country import or export? Identify consumer surplus, producer surplus, and total surplus without trade, and w…

Golang标准库限流器rate使用

限流就是限制系统的输入和输出流量来达到保护系统的目的,限流在实际场景中应用十分广泛,尤其在高并发场景下,为了保证系统的可以用性,我们需要采取一些限流措施降级,一旦达到限制的阈值,就需要限制流量并采…

Vue-admin-template新增TagViews标签页功能,附完整代码

前言 vue-admin-template里面本身是没有TagViews标签页的,只有完整版的vue-element-admin才有,翻找网上的其他教程,要么代码不完整,要么有bug,本篇文章就教大家如何在vue-admin-template的基础上新增TagViews 步骤 …

分布式应用kafka + EFLFK集群部署

前言 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)…

骨传导耳机优缺点有哪些?骨传导耳机科普与推荐

骨传导耳机是一种可以开放耳朵的耳机,所以对于耳朵比较敏感的人来说,这种耳机是比较友好的,同时因为它的佩戴方式,在运动圈内也很受欢迎。只不过骨传导耳机是一种新兴的耳机,所以很多人并不太了解它的优缺点。 我作为…

书店销售管理系统----数据库原理及应用综合实验

枯木逢春犹再发,人无两度再少年🍂 系统主要模块如下: (1) 书店销售管理系统设计与实现—图书入库管理及查询统计 图书入库管理:维护入库图书信息(如图书编号、书名、作者、价格、图书分类、出版…

vue-element-admin后台前端解决方案(基于 vue 和 element-ui)

vue-element-admin后台前端解决方案参考文档下载安装目录结构参考文档 vue-element-admin官网,更多详细内容可以查看社区学习文档。 下载安装 可以把 vue-element-admin当做工具箱或者集成方案仓库,在 vue-admin-template 的基础上进行二次开发&#…

Java 8 给我们更好的消灭空指针解决方案

前言 大家好,在平时的业务开发中,空指针是我们经常遇到的问题, 他可能会导致我们的流程无法正常进行或者一些意外情况的发生。 这就是我们需要避免空指针的原因,那我们有哪些方式去解决这个问题呢? 空指针场景 包装…

Linux系统安装DB2数据库的详细步骤

1、DB2数据库的安装 一、将DB2的安装介质上传至/home目录,并解压: tar –zxvf v9.5fp3_linuxx64_server.tar.gz 二、执行LANGC 三、进入解压后的server目录(cd server/),执行./db2setup,步骤如下: # cd…

数据结构-线性表与链性表(二)

目录 一、学习背景 二、简绍 三、线性表 一、什么是线性表 二、操作 1、插入 2、删除 3、查询 三、数组应用案例中源码分析 1、插入 2、删除 3、get与set 4、扩容 二、单向链表 单向链表结构 循环链表 三、数组和链表比较 1、时间复杂度角度 2、其他维度 3、…

【JS】原生js实现矩形框的绘制/拖动/缩放

1、要点及功能描述 通过js监听mouse事件来实现矩形框的绘制,再通过区分点击的是边角还是其他位置来实现矩形框的缩放和拖动,并且在拖动和缩放时,都做了边界限制,当缩放或拖动 到边界时,就不能继续拉缩放拖动了。当然在…

【个人简介】一枚在上海的AndroidiOSWindow逆向电子工程师

> Hello World!, I am Humenger 「 From Shanghai, China 」 「 Android Reverse engineer, applied electronic technology Shan Dong University, China 」 🐝主要涉及平台: Android(70%),iOS(15%),Window(5%),macOS(3%),其他(7%) 🦋主要涉…

易基因|RNA m7G甲基化测序(m7G-MeRIP-seq)

N7-甲基鸟苷(N7-methylguanosine,m7G)是真核生物tRNA、rRNA和mRNA 5cap中最丰富的修饰之一。作为一种重要的表观遗传修饰,m7G RNA甲基化在基因表达、加工代谢、蛋白质合成、转录稳定等方面发挥着重要的作用,参与疾病发…

Pinely Round 1 (Div. 1 + Div. 2) E - Make It Connected思维分类讨论

昨晚的problem e 一直wa。因为答案,不唯一,调起来只能肉眼debug。被干emo了qwq。好在赛后看到 ugly2333的 思路和我差不多,最后还是要选取度数较小的最优, 好像从度数的角度出发,不容易wa。 题意: 给你一个图&#xf…

什么是组织孤岛?它会带来哪些影响?可以这样去对付它

作为一个在不同地点和时区与不同团队合作的远程工作者,我有过公平的孤岛经历。 是的,它们扼杀了任何组织的成长。那么,在使你(和组织中的每个人)失去生产力、困惑、自私和不快乐之后。 在这篇文章中,我将…

ADRV9009中armBinary反汇编IDA参数设置

armBinary.bin文件如果不做处理的话就是一堆16进制数,扔到IDA里也只是一堆有颜色的16进制数,需要进行一些参数设置。 1 选择IDA32位打开armBinary.bin文件 2 load a new file设置 Processor type选择ARM Little-endian [ARM],点击Edit ARM architecture options进行相应修…

Linux 中的内部命令和外部命令

Linux 中的内部命令和外部命令 作者:Grey 原文地址: 博客园:Linux 中的内部命令和外部命令 CSDN:Linux 中的内部命令和外部命令 什么是 bash shell ? bash shell,就是一个程序,就是 Linux 系统安装的…

漫谈 Java 平台上的反应式编程

反应式编程(Reactive Programming)是一套完整的编程体系,既有其指导思想,又有相应的框架和库的支持,并且在生产环境中有大量实际的应用。在支持度方面,既有大公司参与实践,也有强大的开源社区的…

【Linux】-- 开发工具yum、vim、gcc、g++、gdb、make、makefile使用介绍

目录 一、yum 1.了解yum (1)RPM (2)yum 2.yum使用 (1)查看软件包 (2)安装软件 (3)卸载软件 二.Linux编辑器-vim 1. vim概念 (1&am…