1.运算符&
我们在第一周就看到这个东西,我们说scanf后面一定要有这个&.如果不加&程序就会出错.今天我们终于要来揭开它的面纱了.运算符&用来获取变量的地址,它的操作数必须是变量.为什么会有地址,因为c语言中变量是放在内存里头的,每一个变量在内存中占据一定的地方.它放在某个地方就它就有个地址.我们来看看地址是一个什么类型的值.我们试一下这两段代码:
运行结果:
%p用于输出地址,%x以十六进制输出整数.这两段代码结果都是一样的,第一段代码的第一个printf有一个warning(类型转换警告),第二段代码因为已经强制转换了&i的值所以不会有warning.这是在32位架构下运行得到的结果,我们接下来用64位架构来看一下:
这两者不同是因为64位架构下地址的大小为8字节,而int为4字节,在32位架构下二者大小相等.所以我们可以知道地址的大小和int是否相等取决于编译器.
2.&不能取的地址
&必须对一个变量去取地址,它不能对没有地址的东西取地址.如果它的右边不是一个变量就不能取地址.如int a,b;&(a+b);编译器就会给我们一个error.还有&(a++); &(++a)等等都是不合法的.
3.试试这些&.
首先是第一段代码:
运行结果:
他们大小差值为4,也就是一个int.在内存中,两个相邻定义的变量是紧挨着放的,先定义的变量会在更高的地方,而先定义的变量会在更低的地方,它们分配在内存的堆栈中.在堆栈里我们分配内存给变量是自顶向下分配的.
第二段代码:
运行结果: