关于C语言地址、取地址运算符”&“
2015-04-14 青岛 张俊浩
今天在论坛贴吧看到关于C语言运算符”&“的问题,因为之前自己学C语言时也遇到这个问题,就整理一下思路回帖,也顺便整理成一篇博客~
问题如下:
int
a;
scanf("%d",&a);
我们老师讲,&是取地址符,但是我就奇怪,为什么叫取地址?
我们明明是想知道a是多少,而不是说它在哪,地址不是形容一个事物在哪吗?我输个10,a就是10了。
额,个人感觉C语言是门很”硬“的语言,因为它相对其他高级语言更接近硬件底层,而相对于机器指令汇编又跳出了繁琐的底层处理器指令编程。
无法理解”&“或者说”地址“、”取地址“,是因为你站在高级(自然语言)语言的层面,而不是机器本身。任何变量都是数据,数据就会在硬件机器上有他的存储空间,存储空间有对应的位置,来方便我们操作这个存储空间,比如内存,内存地址。
这里我们定义了变量a,比如int a;实际上是预留了一个存储空间,存储空间有相应的位置,我们用符号”a“来指代,我们编译高级语言的时候,编译器会把我们所以对变量a的操作,转化为对相应存储空间的操作。
对一块存储空间本质上有两种操作,输入和输出。a = 1;//是对存储空间的输入,也就是我们称的左值,把数据”1“写入变量a对应的存储空间;b= a;//是对存储空间的输出,把变量a所对应的内存中的数据输出,也就是我们称的右值,写入变量b所对应的空间。
int scanf(char *format[,argument,...]); 函数中参数其调用格式为: scanf("<格式化字符串>",<地址表>);
如果写做scanf("%d",a);我们是把变量a所在的存储空间中的数据作为右值输出,而在scanf中a变量的值作为键盘终端字符输入存储空间的地址,而这显然是不合理的,因为我们要把键盘终端输入端的字符存到变量a所在的存储空间,而不是变量a存储的数据所指向的内存空间~所以写做scanf("%d",&a);//”&“是以一个操作符,可以获取变量a所在的存储空间位置,而不是变量a所在存储空间中存储的数据~