很多电影里都有这样的情节:某人得到一大笔宝藏后,绘制了一张藏宝图,为争夺这张藏宝图,引发了一系列故事。从这个老套桥段里,可以总结出一些隐含的东西:

1.  为什么要有藏宝图?因为宝藏体积重量大,不方便随身携带;而藏宝图轻巧可携带。

2.  得到藏宝图,基本就能得到宝藏。所以藏宝图≈宝藏。

3.  藏宝图只是一张纸,做为载体的纸一文不值。它的价值完全体现在纸上所画的图。

4.  藏宝图是一张纸,但一张白纸却不是藏宝图,必须画有宝藏的位置才行。

通过藏宝图代替宝藏,这种间接方式有很多好处,于是在软件开发中也发明了类似手段,即指针。指针相当于藏宝图,提供间接访问目标内存的手段,宝藏就是指针所指的内存块。无论谁得到藏宝图后第一件事必然是按图索骥去寻找宝藏。有了指针也要马上想到:这张指针藏宝图指向的宝藏在哪里?这应该形成条件反射。比如:

int *pA;

int A=0x1000;

pA = &A;

printf(“val A=%d\n”, *pA);

pA为指针变量,其值为&A,假设为0x2000,这个值代表某内存单元的地址,也常表述为“指针pA指向地址为0x2000的内存”,而*pA代表通过指针变量访问地址为0x2000的内存单元,即变量A,得到里面的值0x1000。藏宝图(即指针pA)上标明了宝藏地址(即0x2000),通过*pA就可以访问到0x2000里的内容,得到宝藏(即0x1000)。

图1,指针与指针“指向”的内存

指针的值是指针变量本身存储的数值,这个值将被编译器作为另一块内存的首地址。指针所指向的内存区就是从指针所指向的那个内存地址开始,长度为sizeof(指针所指向的内存块的类型)的一个内存块。“指针的值是XX”就代表该指针指向了以XX为首地址的一块内存区域;反过来想让一个指针指向某内存块,就要把该内存块首地址赋予该指针。

使用指针,对其中隐含的两个概念:”the pointer and the memory pointed by the pointer”,一定要区分清楚。可以参考藏宝图与宝藏,从二者的区别和联系去理解一些问题。比如:

1)两者的长度(区别开宝藏和藏宝图本身的属性)

指针占多大的内存?用函数sizeof(指针型)测一下就知道。无论指向什么类型,32位平台指针都占据4字节。不要把指针本身占据的内存长度和指针所指向内存的类型长度混淆。小测试:

int a, b, c ,d ,e, f;

struct pixsel

{

int R;

int G;

int B;

}

a = sizeof(char *);

b = sizeof(char );

c = sizeof(float);

d = sizeof(float *);

e = sizeof(struct pixel);

f = sizeof(struct pixel *);

a, b, c, d, e, f值是多少?答案:4, 1, 4, 4, 12, 4

这个题目侧面考验了”pointer itself and the memory pointed by the pointer”两者的区别。

2)不指向实际内存的指针(皮之不存,毛将焉附)

下段程序中指针的应用发生了什么错误?

void main(void)

{

int *a;

*a =20;

printf(“%s\n”, a);

*a =40;

printf(%d\n”, a);

}

指针定义int *a后,指针自身有了,但指向的内存却没有,指针定义不完整。从寻找宝藏的角度理解,好比买了一张纸,却没有把宝藏所在地画在上面,那就是一张废纸。检查指针与指针指向的内存,这根弦对初学者很重要,要记住:指针本身和它的指向是不同的概念,不要给张白纸就当藏宝图哦

3)中间桥梁——地址

更进一步,在藏宝图与宝藏的关系里,实际有三个元素(白纸/信息/宝藏),只是通常我们把白纸&信息合称为藏宝图。在指针与指针指向的内存之间,实际也有一个隐含的桥梁,即指针里所保存的地址值。

空白的纸和宝藏之间没有关系,因为真正指向宝藏的是宝藏埋藏点的信息,但这个地点信息必须依附于一个载体而存在,这个载体就是那张白纸。同样一个空指针和目标内存块之间,想要有映射关系也需要一个中间桥梁,那就是目标内存块的地址,只有把这个地址放到指针容器里,联系才真正建立,指针才成为有效指针。这种依附关系好比下图:

A.指针是一个变量,B.保存的内容是地址,C.地址指向某内存对象,综合就是C89的定义:指针是一个保存对象地址的变量。变量/(变量中保存的地址)/(地址所指向的内存),三者共同组成了指针体系。

对比其他普通变量,比如整型变量,它也是由一个变量和其中所保存的整型数共同组成,只是相比而言,它里面所保存的只是一个单纯整型数,这个数没有别的意义。而指针变量里所保存的地址则代表另一块内存,这块额外的内存才是指针真正的特殊之处。

指针篇之一 宝藏与藏宝图相关推荐

  1. C语言重点——指针篇(一篇让你完全搞懂指针)

    C语言重点--指针篇(一篇让你完全搞懂指针) 一. 前言 C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的. 这篇我们就来讲解C语言的一大特点,也是难点,指针和 ...

  2. c语言数组数据用指针查找,c语言数组与指针_指针篇_2011.ppt

    c语言数组与指针_指针篇_2011 指 针 6.2 指针的概念6.3 指针与数组6.4 字符串的指针6.5 指针数组和指向指针的指针;6.2.1 地址与指针的概念 ;指针的概念;内存地址;2.数组与地 ...

  3. gorm存指针数据_C语言重点——指针篇(一篇让你完全搞懂指针)

    一. 前言 C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的. 这篇我们就来讲解C语言的一大特点,也是难点,指针和指针操作. 这篇文章我会先从基本类型的存储过程 ...

  4. C语言——指针篇(四)多维数组和多维指针(内含数组指针和指针数组笔记)

    前言:笔者本来是打算在上一篇文章中,把多维数组和多维指针与数组的访问方式结合起来一起写掉.但是在写作过程中,发现创作篇幅明显过长,不利于日后按图索骥,所以又重开了一篇,说说自己的感悟,仅供参考 多维数 ...

  5. C语言——指针篇(三)数组的下标引用和指针访问

    前言:在上一篇文章中,笔者介绍了指针和数组的内存分配以及初始化,这篇文章来整理下关于数组访问的两种方式. 数组的下标引用和指针访问 在正式开始介绍多维指针和多维数组之前,笔者要先介绍一些关于数组下标引 ...

  6. C语言——指针篇(二)指针和数组之内存分配和初始化

    前言:在上一篇文章中说到了指针变量和普通变量的区别,那么这一篇文章中就来说说指针和数组的关联和区别,它们在很多应用场合中可以互相取代,但也在很多场合中有着自己的无法替代的作用和地位. 数组和指针的内存 ...

  7. C语言重点——指针篇(一文让你完全搞懂指针)| 从内存理解指针 | 指针完全解析

    有干货.更有故事,微信搜索[编程指北]关注这个不一样的程序员,等你来撩~ 注:这篇文章好好看完一定会让你掌握好指针的本质 C语言最核心的知识就是指针,所以,这一篇的文章主题是「指针与内存模型」 说到指 ...

  8. 一个C语言的基本教程—指针篇

    文章目录 9. C语言真正的灵魂--指针 (1). 指针到底是什么? (2). 指针的基本结构 (3). 取地址(&)和解引用(*)操作符 (4). 指针有什么用呢? #1.swap函数的例子 ...

  9. python 指针_指针篇 | 指针的灵活让我想起了Python

    本文的题目其实有点蹭Python热度的意思,指针确实很灵活,当然易用程度和Python还是没得比,想要灵活使用指针,仍然要花大工夫.但一旦你感受到了指针的真谛,你也就自然能够感受到指针的灵活了!本文通 ...

最新文章

  1. it行业php,什么是IT行业
  2. Facebook成立AI语言研究联盟,自然语言处理或有新成果
  3. Linux嵌入式驱动管理调试平台 ------ 我的第一个开源项目
  4. Reference resources
  5. 《编写高质量代码:改善Java程序的151个建议》笔记
  6. 有没有大神知道国产加密算法SM2的详细介绍
  7. java匿名内部类runnable_Java内部类:匿名内部类(四)
  8. 第一次失效_神兵小将:净化之力失效地魔兵兽,全靠特殊办法,铁心方式真霸气...
  9. 短信验证码“最佳实践”
  10. android 安卓市场,安卓市场(Android Market).doc
  11. python数据预处理代码_Python中数据预处理(代码)
  12. python 角度传感器模拟_python树莓派红外反射传感器
  13. 商品领域ddd_为 Gopher 打造 DDD 系列:领域模型-资源库
  14. 多个高危漏洞可导致 Chrome 浏览器被黑
  15. jetbot 无法通过浏览器访问_linux中启动tomcat后浏览器无法访问的解决方法
  16. springboot单元测试_springboot2.x基础教程:单元测试
  17. 三菱四节传送带梯形图_PLC控制四节传送带设计
  18. 万能免费信息采集软件-免费网站信息内容数据采集软件
  19. 关于 fir.im 你可能不知道的实用小工具
  20. Amdahl(阿姆达尔定律) Law

热门文章

  1. Android刘海屏、水滴屏全面屏适配详解,android开发权威指南
  2. Chrome浏览器ERR_INVALID_SIGNED_EXCHANGE解决方案
  3. 解决我的驱动无法卸载的问题
  4. WPS:将彻底关闭广告
  5. mysql只能存1000条数据_为什么我mysql的表添加了1000条记录之后就存不进去数据了,客户端也没报错...
  6. 时间序列预测的评估指标补遗
  7. C语言实现函数确定最大最小值
  8. 使用Centreon监控HP惠普服务器硬件状态
  9. Github无法加载或不显示图片解决办法
  10. 昨夜阿里实习生笔试:印象深刻的几道题