scanf 参数为什么需要取地址(你想知道的C语言 2.2)

Q: 同样是整数参数, 为什么printf只需要传入参数本身,而scanf需要取地址?

A: printf只需要获得参数数值,scanf需要修改变量的能力!

    从技术的角度, printf一样可以强制要求取地址, 内部多一道解引用取出数值, 所以没必要!

    而scanf, 传入的参数是值传递, 没办法修改到原变量,所以必须要取地址.

    Mac Libc:

         

      以int为例, 最后是从参数中取int *, 然后存入输入的数据res.

 

    C++引用

      C++引入了引用, 它相当于从编译器角度解决了程序员判断传值或者传地址的困扰. 新技术抽象和编译器加强是不断解放程序员烦恼的有效手段. 

      当然, 新技术也不是可以任意解决程序员的诉求, 一定也要遵循语言的标准和限制.

         比如, 用cin输入数据, 编译器检测到cin, 对比函数原型是引用, 自动明白是"输入"数据, 内部会转换成地址. 

 

#include <iostream>

using namespace std;

int main()
{
	int n;

	cin >> n;
	cout << n << endl;

	return 0;
}

 汇编如下:

leaq 0xf8(%rbp), %rsi

  -> leaq取地址存到%rsi, %rsi是int &的参数.

 

作者:     陈曦
环境:     MacOS 10.14.5
         Apple LLVM version 10.0.1 (clang-1001.0.46.4)
         Target: x86_64-apple-darwin18.6.0
 
转载请注明出处

 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值