跳到正文

指针

Pointer

高级通用

指针(Pointer)是保存内存地址的值,让程序通过这个地址找到并操作数据。它解决了传递或共享大块数据时反复复制的问题;例如图片处理程序可以把像素缓冲区的位置交给处理函数,而不是每次复制整张图片。

你可能会说:「图片处理函数能不能直接处理已有的像素数据,别每调用一次就复制整张图?」

读之前建议先了解(这是一个高级概念)

动手看看

地址像素缓冲区亮度80地址变量0xA100滤镜函数
1

图片像素放在缓冲区里,起始地址假设是 0xA100。地址变量只保存这个位置,不保存整张图片。

要点

  1. 1

    指针保存的是数据的位置

    你可以把一块像素数据放在内存里,再把它的地址交给处理函数。函数拿到指针后,能找到那块数据;指针本身不是像素数据。这样传递数据时,就不必先复制整块内容。

  2. 2

    类型决定如何读取地址内容

    同一个地址上的内容,要按约定的类型解释。比如图片程序按字节读取像素缓冲区,和把它当作整数数组读取,结果可能不同。所以我们看一段指针代码时,也要看它指向什么类型、数据有多长。

  3. 3

    使用前要确认数据还有效

    指针记住地址,不保证那个地址上的数据一直能用。比如处理函数保存了临时图片缓冲区的指针,缓冲区释放后再读取,就可能出错。你需要弄清谁负责保存数据,以及指针会被使用到什么时候。

容易混淆的地方

指针和引用都能让代码操作已有数据,但在 C++ 等语言里,引用通常表现为已有对象的别名,指针则是保存地址的值,可以为空,也可以改为指向别处;具体规则取决于语言。它也不是界面上的鼠标指针:后者说的是用户操作设备时的指示位置,不是程序用来访问内存的地址。

什么时候用

适合用

  • 你在开发原生图片处理模块,需要把已有的像素缓冲区交给多个处理函数,又想避免每一步都复制整张图。
  • 你在对接 C 语言库或系统接口,对方要求传入缓冲区地址,让接口读取数据或把结果写回指定位置。
  • 你在维护链表等底层数据结构,需要让一个节点记录下一个节点的位置,以便沿着节点逐个访问。

不适合用

  • 你只是给网页表单传递姓名和邮箱,没必要引入原始内存指针;用语言现成的对象和参数传递更清楚。
  • 你想在数据库里关联用户和订单,不该保存程序运行时的内存地址;用用户 ID 等稳定标识建立关联。
  • 你想让页面元素跟随鼠标移动,这里需要读取鼠标事件中的坐标并更新界面,不需要操作内存指针。

练一练

你在做一个原生图片处理工具:函数接收像素缓冲区的指针,并把它保存起来,等用户点击“导出”时再处理。调用函数后,原缓冲区就会被释放。你会怎么改?

让 AI 帮你做

请检查这个原生图片处理模块如何传递像素缓冲区指针:标出谁持有数据、何时释放,以及是否有函数在数据失效后继续使用指针。如果需要延后处理,请选择延长缓冲区生命周期或复制数据,并说明取舍。

接下来学什么