摘 要:指针是C/C++编程语言中一种独特,便捷的工具,具有较为强大的功能。然而,指针的概念较为抽象,在教学过程中学生常常会遇到各种问题。本文详细的介绍了指针概念,指出了在实践运用中需要注意的常见问题,并且阐述了指针与引用的关系和区别。
关键词:C/C++ ;指针;引用;常见问题
引言
指针是C/C++语言学习的根基,主要体现在其灵活的运用方式。灵活地运用指针,可有效表示可直接处理内存地址、动态分配内存、复杂的数据结构、更简单有效的处理字符串和数组。因此强化对指针的认识、理解和运用是学习C/C++编程的重中之重。
1指针的概念
指针是一个相对特殊的变量,其中存储的数值被解释为内存中的一个地址。理解指针首先要明确四个方面的内容:指针的类型、指向的类型、指针的值和指针本身所占据的内存区。
在指针的定义语句中把变量名(pointer)去掉,得到这个指针的类型。这各个类型是指针本身所具有的类型。例如:
定义int**pointer,指针的类型为int**;
定义int*(*pointer)[4],指针的类型为int*(*)[4];
指针的类型和指针所指向的类型是两个不同概念。在通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上出发,把指针声明语句中的指针变量名和变量名左边的指针声明符(*)去掉,就是指针所指向的类型。例如:
定义int**pointer,指针所指向的类型为int*;
定义int*(*pointer)[4],指针所指向的类型为int*()[4];
指针的值是指针本身存储的数值,这个值被编译器当作一个地址而不是一般的数值。在32位程序里,所有类型的指针的值都是一个32位整数。
指针所指向的内存区就是从指针的值所表示的那个内存地址开始,长度为sizeof(指针所指向的类型)的一片内存区。一个指针指向了某块内存区域,实际上是该指针的值为这块内存区域的首地址。
指针本身所占据的内存区可用函数sizeof(指针的类型)进行测试。在32位计算机中,指针本身占据4个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否为左值时用处很大。
2指针运用中的常见问题
指针运用的常见问题之一是操作空指针时产生的问题。C++语言中,使用关键字NULL表示未指向任何内存位置的指针,从程序错误的角度将空指针定义为未指向本程序可控地址范围的指针,实际应用中可表现为三种不同的形式。
首先,指针为空。NULL指针此时表示未将指针指向任何地址,相当于int参数中的0,即空指针。对NULL指针指向的内存进行任何读写操作,都会引起程序的直接终止,导致致命错误。因此,在使用一个指针,特别是由其它程序模块传递的指针参数之前,需要对指针进行判断,杜绝对空指针的操作,如:
if(p!=NULL){//do sth…}else{/*error*/}
指针变量未赋初值。C++编译器对未进行初始化的指针变量,并不自动赋值为NULL。因而,对于NULL指针的检测将失效,无法判断指针是否指向了合理的内存空间。需要在程序编写时养成良好的习惯,定义指针变量时对其进行初始化操作,在没有地址空间可指向的情况下,赋值为NULL,以便后继程序的错误检测:
int*p1;/*错误编程习惯*/
int*p2=NULL;/*良好编程习惯*/
指针越界。最长见的越界错误多发生于数组元素读写过程,由于未检测数组的长度,会操作数组空间后的连续内存区域,而这些区域已经不属于本程序的控制范围。和前两种指针错误不同的是,指针越界错误通常不会造成直接的程序终止,而是隐藏的更深,进而对程序后期调试造成不可重现的错误。所以,在操作数组结构时,务必注意对长度的判断,可避免此类指针越界错误。
3指针与引用的关系
在学习C++程序设计语言设计算法的过程中,经常会用到引用这个概念,而且大家也发现引用和指针很相似。经过教学和实践研究发现,引用和指针的确有很多相似之处,但两者决不相同,而且使用引用解决实际问题在许多方面存在优势。
引用与指针的声明方式不同引用是已存在的变量的别名,具体声明方式为:数据类型&别名=变量(或对象)名。而指针是指向一块内存地址的变量,具体声明方式为:数据类型*指针变量名。
从声明方式不难看出,声明引用时必须将引用指向某个对象,同时这个对象的值不能为空。而定义指针时则不必初始化。也就是说在某个时候,指针的值可能为空值,此时的指针不指向任何对象。正因如此,在使用指针时,经常要求对指针进行测试,防止出现空值,而对于引用来说就没有这个必要了,因为它总是与一个对象关联在一起的。
引用与指针作为函数形参和函数的返回值传值时不同。设计函数时,使用引用作为函数的形参进行参数传递比使用指针作为函数的形参进行传递更方便更科学,尤其是在面向对象程序设计过程中。
由实践经验中可以总结出尽管使用引用和指针作函数的参数传值,都能通过调用函数实现被调函数改变参数原始值的目的,但两者在进行传递参数时,传递的方式不同,使用指针作函数形参传递的是实参本身,当在函数中改变形参的值时,改变的就是原来实参的值,也就是原变量的地址发生改变。而对引用则不同。
结语
指针是C/C++语言的精髓所在,灵魂所在,编程学习者应该最带限度的理解指针的概念,在实践中训练指针的合理运用,同时了解并且避免指针运用中的常见问题。
参考文献:
[1] 段新娥等.浅析C++中的引用于指针[J].福建电脑,2010.1
[2] 郭远飞.C++指针编程中的常见问题[J].今日科苑,2009.(22)
[3] 文新.探讨C/C++中的指针[J].科技信息,2009.(17)