码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C语言中,可变参数函数调用的过程?!


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

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

    他的疑问是: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博客

  • 相关阅读:
    Jetpack架构组件学习(3)——Activity Results API使用
    linux
    探讨mfc100u.dll丢失的解决方法,修复mfc100u.dll有效方法解析
    C++this指针
    python环境报错
    2. 内核解压-关中断进入svc模式
    Spring Cloud Ablibaba 学习系列文章
    数字电路与逻辑设计 之 组合电路的设计(多输出电路,全加器,乘法器)
    postgresql pgsql 连接池 pgBouncer(详细)
    高通量筛选——离子化合物
  • 原文地址:https://blog.csdn.net/bennyfun79/article/details/127963301
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号