9.1.1 取地址运算

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.在内存中,两个相邻定义的变量是紧挨着放的,先定义的变量会在更高的地方,而先定义的变量会在更低的地方,它们分配在内存的堆栈中.在堆栈里我们分配内存给变量是自顶向下分配的.

第二段代码:

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值