在C语言中,对于任何类型T,我们都可以在T所在的内存地址处产生一个包含此对象地址的对应变量。如果用比较直观方式来看待这种变量,它们实际上是一种指向对象的变量,因此,这些变量称为指针。在C语言中,指针的重要性不言而喻,但在很多时候指针,又认为指针是一把双刃剑。一方面,指针是构建数据结构和操作内存的精确而高效的工具。另一方面,它们又很容易误用,从而产生不可预知的软件bug。了解到这一点之后,就不奇怪为什么C语言程序员喜欢指针,而其他很多人对它深恶痛绝。无论如何,想要有效地使用C语言,我们必须对指针有透彻的了解。本章介绍关于指针的几个重要主题,并同时介绍几种使用指针的技术,这几种技术将贯穿整本书。
本章内容包括:
指针基础
一方面,知道理解指针的最佳方法:画图表。另一方面,学习在使用基本指针的过程中如何避免空指针产生。
存储空间分配
存储空间分配是指在内存中预留存储空间的过程。理解指针与内存分配是密不可分的非常重要,当通过指针访问内存时,其意义就如同一个虚拟的菜谱一样,指针(内存地址)对应菜名,其所指向的内存空间中的数据对应实际的菜。
数据集合与指针的算术运算
在C语言中,数据集合主要指结构和数组。指针的算术运算定义指针的计算规则。指向结构的指针对于建立数据结构起着至关重要的作用。在C中,数组和指针一样,都是以指针算术运算的方法进行运算的。
作为函数参数的指针
通过这种方式,可以按照传递引用的方法传递函数参数。在C语言中,传递数组或大型结构时,使用指针是一种普遍而高效的方法。
指向指针的指针
这是一种指向指针的指针,而不是指向具体变量的指针。指向指针的指针作为函数的参数来传递是非常普遍的。
泛型指针与类型转换
泛型指针和类型转换是用来跨越和覆盖C语言的类型系统的途径。泛型指针指向某一数据而不需要理会数据的具体类型。类型转换允许临时地改变数据的类型。
函数指针
指针指向可执行代码段或指向调用可执行代码段的信息块,而不是指向某种具体数据。它们把函数当做一小段数据来存储和管理。
指针基础
回想一下,一个指针其实只是一个变量,它存储数据在内存中的地址而不是存储数据本身。也就是说,指针包含内存地址。很多时候,即使是有经验的开发人员都很难形象表达这种不太直观的数据关系,特别是在处理类似于指向其他指针的指针这种更复杂的指针结构时就尤为明显了。因此,用来理解指针的最好方法之一就是绘制图表(见图2-1)。指针通常都是按位置用箭头一个一个连接起来,而不是在图表中画出实际的地址。当指针不指向任何数据,也就是说指针被设置成NULL时,用两条竖线来表示(见图2-1,第4步)。
![]() |
| (点击查看大图)图2-1:指针操作的图例 |




