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
 
转载请注明出处

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页