程序从硬盘加载到内存里运行,各种变量(静态变量,临时变量,全局变量,字符串等等)都需要放在内存里,我们需要去创建、修改和获取某个变量就得知道这东西存在哪,也就是放在内存的哪个疙瘩。内存的排列是线性的且内存可以操作的最小单位是一个字节(1个byte,可存储0~255范围的值)。在你聪明的大脑瓜里应该能想象一条长长的线段被均匀的分割成n个段落,每一个小段落就是一个字节。这样的话我们就能给每一段内存定义一个唯一的编号,32位系统下是0x0~0xffffffff。
char fit = 1;
int fat = 1;
第一行,创建一个char类型变量就申请了一个字节的内存,而他在内存里的地址假设是 0x100;

...[0x100][0x101][0x102][0x103][0x104][0x105][0x106]...

|   1      |     1  |      0   |      0   |    0     |   未知 |   未知 |
那么0x100开始的这一个字节的内存就存放了变量fit的值1,0x100可以看做一个门牌号,这个1字节大小的房子里放了一个值:1

注意有意思的来了

int类型咋办呢,他一次要占用4个字节啊?其实也简单,占4个房子呗。隔壁0x101~0x104都买了然后在第一个房子那存上1,这一段内存就是变量fat所占用的内存空间。

接下来进入正题——指针。

指针的定义 type * varName
char* pc = NULL;//赋值为NULL指的是空指针,也就是当前没有指向有效的内存
int* pi = NULL;
short* ps = NULL;
long* pl = NULL;
float* pf = NULL;
double* pd = NULL;

char fit = 1;
int fat = 1;char* pFit = &fit;
int* pFat = &fat;

这里的&代表取址,获取房子fit和fat的门牌号也就是变量fit和fat所在内存的地址。

以下2段代码等效。
fit = 2;
fat = 123456;

*pFit = 2;
*pFat = 123456;

这里的*代表取值,
cout << pFit;//输出指针地址 0x100;
cout << *pFit;//输出指针pFit所指向的内存的值2;

那更有意思的来了

int fat = 1;         //假设所在内存地址是0x100,也就是门牌号0x100fat = fat + 1;       //这里fat = 2应该没有疑问int *pFat = &fat;pFat = pFat + 1;    //也可以是++pFat;pFat = pFat - 1;    //也可以是--pFat;

是的你没看错,指针也是能够进行加减运算的,那么它的结果是什么呢?让我们再回到指针本身的意义上来,指针是一个指向内存地址的变量,那么它的加减法就是对它指向的内存地址进行计算。以++pFat为例,原本指向0x100的指针自增1之后就指向了0x104,为什么不是0x101呢,这里就要看指针所指向的类型的大小了,int *pFat = &fat; 这里指针所指向的类型就是int一个int占4个字节,这也是这个指针进行加减运算的最小单位。当然了你也可以直接这么操作pFat+= 2; 能告诉我他的指向的地址从0x100跳到那了么?

是0x100 + sizeof(int) * 2 = 0x108;

接下来我想皮一皮,诶,就是玩儿~

int fat = 0;         //假设所在内存地址是0x100,也就是门牌号0x100
char *pFat = (char*)&fat;*pFat = 1;
cout << fat << endl;++pFat;*pFat = 1;
cout << fat << endl;

这一部分和上面主要的不同在于我用指向char类型的指针来接受int类型变量fat的地址,那我们来看看这样会发生什么。

*pFat = 1; 将fat所占用的4个字节内存中的第一个字节赋值为1,这个时候fat的值被解析为1,也就是cout输出是1 。

++pFat;  这个时候pFat指向的内存地址变成了0x101。

*pFat = 1; 将fat所占用的4个字节内存中的第二个字节赋值为1,这个时候fat的值被解析为257,也就是cout输出是257 。

话不多说,待我掏出大宝贝———计算器之程序员专用版。建议你和我一样打开计算器,自己尝试点一点看看输出的变化。

(注意分辨一下,这的左右顺序和上面的小房子是相反的)

有小伙伴说那如果我这么搞呢,pFat += 500; *pFat = 10;会怎么样了,从我们案例的代码来说是会报错崩溃的,因为你+=500之后指向的内存没有被初始化,就像是你随便给个地址说你进房子去住吧可是这里根本没建好不能住人的这不就出大事了么。

指针可以直接操作内存空间在开发的时候可以非常灵活,但是,越是自由越要自律。C/C++语言之所以强大很大一部分体现在其灵活的指针运用上因此,说指针是C/C++语言的灵魂一点都不为过。

课程到这里就结束啦,感谢你的到来,感谢你的支持。关于指针我还会再写些深入一点的内容,敬请期待。

——@猫叔压力大

指针之保姆级教程10分钟就能收获这个神秘的大宝贝相关推荐

  1. 初阶指针(保姆级教程)

    目录 一.指针是什么? 1.1 指针 1.2 指针变量 1.2.1 指针变量是什么? 1.2.2 指针变量的大小 二.指针和指针类型 2.1 指针类型的意义 2.1.1 指针类型决定了访问空间的能力 ...

  2. 天才少年稚晖君 | 【保姆级教程】个人深度学习工作站配置指南

    天才少年稚晖君 | [保姆级教程]个人深度学习工作站配置指南 来源:https://zhuanlan.zhihu.com/p/336429888 0. 前言 工作原因一直想配置一台自己的深度学习工作站 ...

  3. 保姆级教程带你在VMware中安装Linux Debinan操作系统

    保姆级教程带你在VMware中安装Linux Debinan操作系统 文章目录 保姆级教程带你在VMware中安装Linux Debinan操作系统 1.Debinan系统介绍 2.Debinan操作 ...

  4. 【强化学习实战-04】DQN和Double DQN保姆级教程(2):以MountainCar-v0

    [强化学习实战-04]DQN和Double DQN保姆级教程(2):以MountainCar-v0 实战:用Double DQN求解MountainCar问题 MountainCar问题详解 Moun ...

  5. 数仓建设保姆级教程,离线和实时一网打尽(理论+实战)

    本文大纲: 因内容较多,带目录的PDF查看是比较方便的,点击下方链接获取完整PDF版: 数仓建设保姆级教程PDF文档 一.数仓基本概念 1. 数据仓库架构 我们在谈数仓之前,为了让大家有直观的认识,先 ...

  6. 50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 下

    文档大纲: 本文上半部分之前已经发过了,传送门:50000字,数仓建设保姆级教程,离线和实时一网打尽(理论+实战) 上 此篇文章是整个文档的下半部分,将接着上半部分从第五章开始. 五.实时数仓建设核心 ...

  7. 保姆级教程从零搭建云服务器(小彩蛋,请大家看烟花秀)

    笔者已从零搭建好云服务器,在文章开始笔者请大家看一场简单的烟花秀,该篇博文是写给小白的保姆级教程,不论是有基础还是没基础的,都可以根据本篇博文,轻松搭建个人云服务器. 烟花秀:浏览器直接输入ysw.w ...

  8. 《软件安装与使用教程》— Windows操作系统快速安装MATLAB最新最全教程(保姆级教程以MATLAB2019A为例)

    <MATLAB教程>- Windows操作系统快速安装MATLAB(保姆级教程以MATLAB2019A为例) 目录 <MATLAB教程>- Windows操作系统快速安装MAT ...

  9. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)...

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

最新文章

  1. qt dll 1% 不是有效的win32应用程序
  2. mdx词典包_推荐几款实用的英语词典
  3. jni c运行java字符串,通过JNI将C ++字符串发送到Java
  4. hadoop学习5 搭建storm集群
  5. Asterisk权威指南/第六章 拨号计划基础
  6. java传参数的方法_java中方法的参数传递机制
  7. 微信小程序|area组件使用的地址数据文件
  8. liunx 命令 之 mkdir 与 touch
  9. OpenGL基础36:天空盒
  10. express 设置handlebars模板引擎
  11. CNware防DDOS攻击介绍--云宏
  12. Flutter 如何实现禁止手机横屏的功能
  13. 一个简单炫酷的前端小项目(html+css+js)----3D图片演示
  14. linux换屏快捷键,Linux系统快捷键最全合集
  15. 淘晶驰串口屏入门(四)进度条、滑块、定时器、单选框、复选框、二维码
  16. shutdown immediate 太慢,需要进行进程查杀
  17. 索尼Xperia S_4.0一键ROOT工具┇_┇免解锁┇_┇一分钟ROOT┇_┇
  18. python实现企业微信群机器人提醒功能
  19. Motivated Word(6)
  20. springboot社区快递代取服务系统毕业设计-附源码

热门文章

  1. BufferedReader和scanner用法和区别
  2. C++程序设计课程师生互动(2012年春第10周)
  3. Stream跟String到底有啥区别
  4. OAuth2介绍与使用
  5. 对抗生成网络学习(四)——WGAN+爬虫生成皮卡丘图像(tensorflow实现)
  6. 为远程设计团队构建辛辣的设计工具堆栈
  7. 安卓APP保活--十种方案
  8. 系统漏洞是威胁计算机网络安全的形式,系统漏洞是不是威胁计算机网络安全的形式...
  9. 网页开发可以使用多种编程语言。以下是一些常用的编程语言及其优缺点
  10. srm采购管理系统有那些功能