6.1 内存和地址

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

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

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

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

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

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

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

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

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

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
下面是这些位可能被解释的许多结果中的几种。

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

6.3 指针变量的内容

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

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

6.4 间接访问操作符

[C和指针] 6-指针的更多相关文章

  1. C与指针(结构体指针,函数指针,数组指针,指针数组)定义与使用

    类型 普通指针 指针数组(非指针类型) 数组指针 结构体指针 函数指针 二重指针 定义方式 int *p; int *p[5]; int (*p)[5]; int a[3][5]; struct{.. ...

  2. C/C++:提升_指针的指针和指针的引用

    C/C++:提升_指针的指针和指针的引用 写在前面 今天在使用指针的时候我发现了一个自己的错误.

  3. 理清C++常量指针和指针常量这团乱麻

    写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头.其实本来没什么,这无非是const int *p与int* const p的区别, 但一涉及到起名字 ...

  4. 详解c++指针的指针和指针的引用

    展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它.(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方 ...

  5. 指针的指针&指向指针数组的指针

    一.指针的指针    指针的指针看上去有些令人费解.它们的声明有两个星号.例如:        char ** cp;    如果有三个星号,那就是指针的指针的指针,四个星号就是指针的指针的指针的指针 ...

  6. C语言 详解多级指针与指针类型的关系

    //V推论①:指针变量的步长只与‘指针变量的值’的类型有关(指针的值的类型 == 指针指向数据的类型) //指针类型跟指针的值有关,指针是占据4个字节大小的内存空间,但是指针的类型却是各不相同的 // ...

  7. C/C++ 一段代码区分数组指针|指针数组|函数指针|函数指针数组

    #include<stdio.h> #include<stdlib.h> #include<windows.h> /* 举列子说明什么是函数指针 */ //以一个加 ...

  8. C++ 必知必会:条款15 成员的指针并非指针

    指向类成员的类成员的指针说是“指针”,其实是不合适的,因为他既不包含地址,其行为也不像指针 常规的指正,包含地址,对其解应用可以得到该指针包含地址所指向的对象 1: int a = 12: 2: in ...

  9. o4.数组指针和指针数组的区别

    ------- android培训.iOS培训.期待与您交流! ---------- 我们看一下数组指针和指针数组: 数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个 ...

  10. 不可不表的OSG智能指针之强指针与弱指针 《转载》

    不可不表的OSG智能指针之强指针与弱指针 <转载> 使用OSG的人都知道OSG的内存管理方式采用了智能指针,通过智能指针的方式让OSG自己处理对象的销毁工作.在OSG中有两个智能指针类型, ...

随机推荐

  1. 2018/3/4 Activiti教程之对于流程的基本操作以及从发起到完成还有相关注意事项(与Springboot整合版)三

    写教程实在太累了,,,还浪费时间,Activiti教程就写到这好了,不过最近在玩区块链,到时候写几个区块链方面的教程. 这是一些流程的查询与删除api,删除这块,默认是级联删除(加个false参数,就 ...

  2. cdq分治入门--BZOJ1492: [NOI2007]货币兑换Cash

    n<=100000天,一开始有s块钱,每天股票A价格ai,B价格bi,每天可以做的事情:卖出股票:按A:B=RTi的比例买入股票.问最后的最大收益.股票可以为浮点数,答案保留三位. 用脚指头想想 ...

  3. [bzoj1207][HNOI2004]打鼹鼠_动态规划

    打鼹鼠 bzoj-1207 HNOI-2004 题目大意:题目链接. 注释:略. 想法: $dp_i$表示打到了第$i$个鼹鼠时最多打了多少个鼹鼠. $O(n)$转移即可. 总时间复杂度$O(n^2) ...

  4. Spring在Java Filter注入Bean为Null的问题解决

    在Spring的自动注入中普通的POJO类都可以使用@Autowired进行自动注入,但是除了两类:Filter和Servlet无法使用自动注入属性.(因为这两个归Web容器管理)可以用init(集承 ...

  5. php配置(php7.3)

    [PHP] ;;;;;;;;;;;;;;;;;;; ; About php.ini ; ;;;;;;;;;;;;;;;;;;; ; PHP's initialization file, general ...

  6. 基于TensorFlow的图片识别服务

    1.使用TensorFlow Retrain进行图片分类训练 https://www.tensorflow.org/versions/master/how_tos/image_retraining/i ...

  7. 【CV论文阅读】+【搬运工】LocNet: Improving Localization Accuracy for Object Detection + A Theoretical analysis of feature pooling in Visual Recognition

    论文的关注点在于如何提高bounding box的定位,使用的是概率的预测形式,模型的基础是region proposal.论文提出一个locNet的深度网络,不在依赖于回归方程.论文中提到locne ...

  8. myloader恢复mysql数据库演示样例

     mydumper是针对mysql数据库备份的一个轻量级第三方的开源工具.备份方式为逻辑备份.它支持多线程.备份速度远高于原生态的mysqldump以及众多优异特性.与其相配套的恢复工具则是mylo ...

  9. C++ auto 与 register、static keyword 浅析

    [register/auto的比較分析] #include <iostream> using namespace std; int main(){ int i,sum=0; for(i=0 ...

  10. 多button事件处理

    private void ButtonClick(object sender, RoutedEventArgs e) { Button cmd = (Button)e.OriginalSource; ...