[C和指针] 6-指针

6.1 内存和地址

我们可以把计算机的内存看作是一条长街上的一排房屋,每座房子都可以容纳数据,并通过一个房号来标识。
这个比喻颇为有用,但也存在局限性。计算机的内存由以亿万计的位(bit)组成,每个位都可以容纳值0或1.由于一个位所能表示的值的范围太有限,所以单独的位用处不大,

通常许多位合成一组作为一个单位,这样就可以存储范围较大的值。这里有一幅图,展示了现实机器中的一些内存位置。
1075214-20181107200718648-986759178.png

这些位置的每一个都被称为字节(byte),每个字节都包含了存储一个字符所需要的位数。上面这张图并没有显示这些位置的内容,但内存中的每个位置总是包含一些值。

每个字节通过地址标识,如上图方框上面的数字所示。
为了存储更大的值,我们把两个或更多个字节合在一起作为一个更大的内存单位。例如,许多机器以字为单位存储整数,每个字一般由2个或4个字节组成。下面这张图所表示的内存位置与上图相同,但这次它以4个字节的字表示。
1075214-20181107201304982-330250936.png

注意,尽管一个字包含了4个字节,它仍然只有一个地址。在要求边界对齐的机器上,整型值存储的起始位置只能是某些特定的字节,通常是2或4的倍数。注意:
  1. 内存中的每个位置都有一个独一无二的地址;
  2. 内存中的每一个位置都包含一个值。

地址与内容
这里有另外一个例子,这次它显示了内存中5个字的内容
1075214-20181110142451921-1896661186.png

这里显示了5分整数,每个都位于自己的字中。如果你记住了一个值的存储地址,可以通过这个地址取得这个值。但是,要记住所有这些地址实在是太笨拙了,所以高级语言所提供的特效之一

就是通过名字而不是地址来访问内存的位置。下面这张图与上图相同,但这次使用名字来代替地址。
1075214-20181110142840580-795106605.png

当然,这些名字就是我们所称的变量,名字与内存关联并不是硬件提供的,它是由编译器为我们实现的。所有这些变量给了我们一种更方便的方法记住地址----硬件仍然通过地址来访问内存位置。

6.2 值和类型[注意]

现在让我们来看一下存储于这些位置的值,头两个位置所存储的是整数。第3个位置所存储的是一个非常大的整数。第4、5个位置存储的也是整数。下面是这些变量的声明:

int a = 112, b = -1;
float c = 3.14;
int d = &a;
float
e = &c;

在这些位置中,变量a和b确实用来存储整型值。但是,它声明c所存储的是浮点值。可是,在上图中c的值却是一个整数。那么它到底是哪个呢?整数还是浮点数?
答案是该变量包含了一序列为0或者1的位。它们可以被解释为整数,也可以被解释为浮点数,这取决于它们被使用的方式。如果使用的是整型算术指令,这个值被解释为整数。如果使用的是浮点型指令,就被解释为浮点数。
这个事实引出了一个重要的结论:`不能简单地通过检查一个值的位来判断它的类型`。为了判断值的类型(以及它的值),你必须观察这个值的使用方式。考虑下面这个以二进制形式表示的32位值:
011001110110110001101111101100010
下面是这些位可能被解释的许多结果中的几种。

1075214-20181110144618923-672803023.png

这里,一个单一的值可以被解释为5种不同的类型。显然,值的类型并非值本事所固有的一种特性,而是取决于它的使用方式。
当然,编译器会帮助我们避免这些错误,如果我们把c声明为float类型,那么当程序访问它时,编译器就会产生浮点型指令。如果我们以某种对float类型而言不合适的方式访问该变量时,编译器就会发出错误或警告消息。

6.3 指针变量的内容

让我们把话题返回到指针,看看变量d和c的声明,它们都被声明为指针。

1075214-20181110145411859-1424446057.png

d和e的内容是地址而不是整型或浮点型数值。事实上,d的内容与a的存储地址一致,而e的内容与c的存储地址一致。区分变量d的地址(112)和它的内容(100)是非常重要的,同时也必须意识到100这个数值用于标记其他位置(变量a的地址)。

6.4 间接访问操作符

转载于:https://www.cnblogs.com/linuxAndMcu/p/9925379.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值