浅谈c语言中指针的概念及基本应用规律
邓威威 王延鹏 (黄淮学院,河南 驻马店 463000)
摘 要:指针是c语言的精华,抛开指针的c语言是没有生命力的。虽然如雷贯耳的JoelSpolsky~说过对指针的理解是一种天赋,不是通过
训练就可以达到的。但鉴于其重要性和学生学习中关于该内容理解程度普遍低下的不幸事实,我认为深入理解指针的本质含义,对我们编
写程序还是有很大帮助的。笔者从几个方面来剖析指针的本质,并着重围绕指针的一个重要应用一一动态分配内存来谈谈如何回避常见错
误,形成科学正确的编程习惯。
关键词:c语言;指针;应用规律
1C语言指针中的两个概念区分 用的情况下指向此处,可以保护系统。
(1)数组指针和指针数组。指向数组的指针称为数组指针, (2)如果利用指针动态申请内存,使用过后注意释放内存,
数组的特点是数组中每个元素类型相同,且在 内存中连续存 否则会造成内存泄漏。程序的内存空间一般分为四个逻辑区
放,只要数组指针向一个成员,则可顺次推算出其余成员的地 域,即代码区、全局数据区、栈区和堆区。当程序执行的时候,
址,因此通过数组指针可将数组中的所有元素间接访问;指针 其可执行文件作为二进制机器指令被调入内存顺序存放,以实
数组是指一组类型相同的指针组成的数组,其与数组指针最大 现所谓的自动执行。栈区主要是函数调用的活动区域,为函数
的不同是,指针数组在指针的数量上有所改变,它由一个指针 分配局部动态变量等,函数调用结束后系统会自动收回内存。
演变到一组同类指针。 全局数据区存放的是静态和全局变量,随着程序的消亡而自动
(2)指针函数与函数指针。指针函数是返回值为指针的函 收收回内存。一般我们常说的内存泄漏是指堆内存的泄漏。堆
数,指针函数打破了其它高级语言中的指针、数组不能作为返 内存是指程序从堆区中分配的,大小任意的(内存块的大小可以
回值的局限,体现了C语言程序的灵活性。值得注意的是,若使 在程序运行期决定),是由程序员自己需要时申请,使用完后也
用变量的地址作为函数的返回值,此地址所对应的变量空间如 必须用程序代码显式释放的内存。应用程序一般使用mal-loc,
果被释放,其中的数据可能发生了变化,那么就不能达到正常 realloc,new等函数从堆中分配到一块内存 (通过指针变量记
的传送数据的目的,另外在使用指针函数时,接受函数值的变 录 该段内存的首地址来实现),使用完后,程序必须负责相应
量也必须为指针,且应与返回值的类型相同。指针变量可以指 的调用free或delete释放该内存块,否则,这块 内存就不能被
向整型变量、字符串变量、也可以指向函数的入 口地址和指针为 再次使用,我们就说这块 内存泄漏了。使用指针时,在赋值等
函数指针。函数指针是一个高深的概念,函数指针的作用是函 重要操作之前要注意观察指针的当前指向, 做适当的显式判
数间传递函数,指针函数与函数指针的相似之处在于两者都跟 断,动态申请内存块,尤其要保留其指针初值,以便释放内存。
函数有关,不同之处在于指针函数中的指针指向函数出口,而函 如下列代码段:
数指针中的指针指向函数入 口,二者指向方向的差异是两者间 如果缺少free(str)语句,将造成1000个字节的堆内存泄
的最大区别。 漏。引起内存泄漏的主要原因在于内存分配后指向内存的指针
2指针一些主要应用的基本规律 丢失了。在堆里动态申请内存以后,如果擅自修改指针的指向,
就会早成野指针而迷失方向,无法回收内存,引起泄漏。
我们已经看到,所谓指针的概念跟内存有着紧密的联系。
(3)指针所指向的内存回收以后,也要清除指针,安全起见
对指针的理解,本质上是对内存的理解,毕竟内存是生命空间。
将其重置为NULL。
而指针的一些主要应用,也的确凸现了这一点,让无数学生头痛