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

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. 一图看清全球270家典型区块链服务商
  2. STM32 基础系列教程 33 - Lwip_tcp_client
  3. 极简写作语言-Markdown
  4. r java_如何在R中使用JAVA写的程序包?
  5. iOS 应用程序的国际化
  6. Smartfox Server 2x 在 CentOS6.3 上的搭建
  7. ubuntu环境下redis的安装配置
  8. extract()和extact_first()的区别
  9. gjb150.16a-2009振动试验标准及介绍
  10. WIFI密码破解笔记
  11. deecamp训练营
  12. 淘宝新店铺有哪些扶持
  13. Twitter开发者账号申请流程
  14. [导入]饭后适宜吃14种健康零食
  15. ECCV 2022 | 基于去遮挡和移除的3D交互双手姿态估计
  16. 物流查询然后给快递单号进行备注分享操作方法
  17. pycharm安装使用技巧
  18. 基于Openwrt 拨号上网(SDX55) (PCIe)移植文档
  19. 通信原理课程设计报告
  20. 墨客UTXO和account模型

热门文章

  1. 解决 Hyper-V R2 虚拟网卡影响网速变慢问题
  2. 第一次使用ESP8266_01S
  3. Linux路由器的配置
  4. 中关村企业 大数据_中关村大数据企业产业规模年均增长20%以上
  5. 水稻CBL家族蛋白质查找
  6. 你的华为手机还会卡?那是这3个功能没设置吧,越早关掉越好
  7. I/O error on POST request for “http://localhost:9411/api/v2/spans”
  8. Mysql存储过程名规则_数据库对象命名规范一(原则、命名、 表、视图、存储过程、函数、触发器命名规范)...
  9. Excel 快速合并多行数据为一行
  10. 挑战EUV光刻:NIL靠谱吗?一文秒懂