博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针_褪去语法糖
阅读量:75 次
发布时间:2019-02-25

本文共 1664 字,大约阅读时间需要 5 分钟。

指针

前言

是否你也曾上学时刚接触指针时理解和运用起来一脸懵,而书上的概念却有生涩难懂?其实当你完全掌握理解了指针的时候,这些问题都将迎刃而解,无论多级指针都可以褪去语法糖看其本质。(其实并没多级指针这概念,只是为了让人们更好理解才附加的)。

有些东西理解起来可能很轻松,但表述出来确又是一回事。这也是很多书对指针的解释让人很难理解的原因。不过没关系,相信看完以下内容各位对指针能有新的理解,废话不多数看下直奔主题。

指针->内存

想要理解指针光从指针定义来看是不够(有人可以很好的运用指针,但本质了解确实模糊的),还需要了解一些其他的知识,尤其是对内存运用的理解。

内存—用来存放东西

人类所有的灵感都源于生活,其实内存也不例外。计算机中要存储东西,利用的正式生活中的思维。

计算机的内存是一块用于存储数据的空间,由一系列连续的存储单元组成。

  • 联想

内存你可以类比为一个快递中心的仓库

仓库中放着各种存放快递的盒子
盒子大小可以不一样(大小便是由普通变量类型控制的)。
在这里插入图片描述

  • 内存编址(32Bit为例)

假如我们需要去仓库取出自己的快递,我们可以给每个盒子编上一个不同的号码代表不同的身份。这号码也就是内存中的地址,在内存中它是连续的,唯一的。

  • 联想

盒子中我们可以放快递,当然也能放写上地址号的字条,通过这样间接寻找同样能找到快递。这就是所谓的指针的作用(下文继续解释 指针的作用)。

在这里插入图片描述

  • 大端和小端存储(不知道的自行百度下)
    计算机存储都以Byte(字节),为最小单元。32位计算机即能每次读取4字节的内容(如,0x0000)。
    注:读取位数,推荐拓展了解: 计算机组成原理___地址线和数据线读取数据。

指针(大小/类型/作用域)

几乎所有的书都说指针是存储地址的。有人赞同,有人觉得还不够深刻(这里就看大家自己的理解咯)。下面我们就来分析下原因了,其实上图也已经体现的很明显了。

联想: 现实生活中存储东西,东西有不同。计算机中存储的数据同样有不同。

在计算机中,

整数对应着整型变量。
浮点数对应着浮点型变量。
字符对应着字符型变量。
同样,指针对应着指针型变量。

导致不同变量的原因: 同一种变量无法便是不同的东西(一 一对应性)。

  • 指针是一种变量

变量三要素:

大小
类型
作用域

  • 指针类型
    我们不必区分几级指针
    int*
    int**
    int***
    等等我们统称为int* 类型,即指针类型。

我们常见的普通类型由int,char,double,float等类型,说白了不同类型,都是为了更方便你找到你需要的东西。

指针本质

需要知道在内存中存储普通变量,即int a,float b,double c,char d这些都是以地址存储的(编译器完成),a,b,c.,d这些都是为了给人看清楚分辨的。

此处粘贴一点点汇编代码证明:

在这里插入图片描述

注:红色里面是寄存器寻址方式,分别是a,b,c,d的地址。

我们再回到这张图

在这里插入图片描述
我们已经可以存储int,float,double,char这些类型了,为了与这些类型区别开来专门存储地址所以有了指针类型。
例如0x002存放了0x006这个地址,所以我们即可直接通过0x0006取到int值,也是间接先通过0x0002->0x0006->int值。

辨别多***中的变量

  • 重点清楚两点概念,区分变量身份

    <1>指针类型是 int* (int可用任何普通类型替代,如char,double等)
    <2>指针是用来存放地址间接引用别的变量(包括指针)

  • 实例

    int* a
    int** b
    int*** c
    为了好理解,我们改写为下面的写法(编译效果一样)

    int* a		//变量为a  int* *b		//变量为*b  int* **c		//变量为**c

作用:这样在&解引用的时候就能很清楚的理清变量对象。

结束语

欢迎有不同理解的朋友交流,这篇就到理论为止吧,后面有机会再写讲讲指针的各种使用姿势吧。(主要是理解的想要简单表述成大家能很好理解的实在太纠结怎么写了,脖子挺不住了…告辞)

转载地址:http://kke.baihongyu.com/

你可能感兴趣的文章