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