学习C语言指针应注意的几个问题
摘要:指针是C语言中的一个重要概念。指针的引入增强了C语言的灵活性和高效性,同时由于指针的用法过于灵活也使得初学者经常感到难以驾驭,甚至经常出现理解错误和应用错误。本文对学习C语言指针应注意的几个问题进行了探讨。
关键词:指针 C语言 空指针
指针的引入增强了C语言的灵活性和高效性,同时由于指针的用法过于灵活也使得初学者经常感到难以驾驭,甚至经常出现理解错误和应用错误。笔者认为初学C语言指针应注意以下几个问题。
一、正确理解定义指针基类型的必要性
指针变量是存放地址的,但在定义指针变量时必须指明其基类型。例如:对指针变量p的定义(char * p;)这里的char即是指针变量p的基类型,也就是说定义p为指向字符型数据的指针类型。
在定义指针时指明其基类型是非常有必要的。虽然C语言中允许定义通用指针类型(*void类型),但这种通用类型应被理解为指向空类型的数据或不能指向确定类型的数据,而不应被理解成可以指向任何类型的数据。在具体使用通用类型的指针时一般要通过显式强制类型转换将其转换成一个有确定类型的指针。例如,在C语言中通常利用malloc函数(该函数的原型为:void* malloc(unsigned int size);)来实现内存的动态分配。该函数的返回值就是一个通用型指针,该指针不指向任何特定数据类型的数据,它只是返回malloc函数所分配的内存空间的第一个字节的地址。在真正利用这段内存空间存储数据时,一般还要通过显式强制类型转换将其转换成一个有确定类型的指针,例如:p=(int*)malloc(100*sizeof(int)),这样就在内存中开辟出了能存放100个整型数字的空间,而基类型为整型的指针p指向这段内存空间的第一个字节。
C语言初学者普遍存在一个疑惑,那就是既然指针变量中存放的是内存地址,为什么还要设定类型,内存地址只不过是一个数字难道还有类型之分吗?必须为指针变量设定类型的原因有二。(1)不同数据类型的数据在内存中占据的存储空间的大小不同,比如一个整型数需要占用4个字节而一个字符只需占用1个字节。如果不指定指针的类型,通过指针引用该指针所指向的变量时,就无从知道应该取从该指针所指向的内存地址开始的几个字节的数据;(2)在指针进行加减运算时,如果不指定指针的类型,就无法判断指针具体应该加减的数值。例如int * p;p++;这里指针p的值加1,实际上意味着指针p中存储的地址值要加4,因为一个整型数在内存中要占据4个字节的存储空间。这里如果不指定指针p的类型,就无法判断指针p中存储的地址值具体应该加减的数值。
二、正确理解空指针
空指针不指向任何对象。应特别注意空指针并不是指*void类型(通用指针类型)的指针。把一个指针定义为空指针通常采用给其赋值为NULL的.方式(例如int * p;p=NULL;)。在使用malloc函数动态分配内存时,如果返回值是NULL则意味着该函数执行失败,原因一般是由于内存空间不足,无法分配malloc函数所要求数量的内存空间(例如:int * p;p=(int*)malloc(1000000000000*sizeof(int));)。
NULL的本质即为常数0,在C语言编译器的头文件stdio.h或stddef.h中把NULL以宏的形式定义为常数0,也就是说int*p;p=NULL;与int*p;p=0;是等效的。
在C语言中对一个值为NULL的指针变量进行间接访问操作是非法的。例如,运行如下程序由于对值为NULL的指针变量进行了间接访问,将会导致程序终止。
#include
void main()
{int*p; p=NULL; printf("%d",*p);}
三、注意指针变量赋值的类型匹配原则
对任何类型的变量赋值都应遵循类型匹配的原则,给指针变量进行赋值时赋值运算符两边的类型往往不容易准确辨识,所以更容易犯赋值类型不匹配的错误,故而在对指针变量进行赋值时应认真检查赋值运算符左右两侧类型是否匹配。例如int*p,a[10];p=&a;中a作为数组名本身就代表数组首元素的地址即&a[0],在a前由加了一个去地址符&就导致表达式p=&a;赋值运算符左右两侧类型不匹配。
另外需要注意虽然指针变量是存放地址值的,但不可以将具体的数字赋值给指针变量,例如int*p,p=0x1234cdef;在编译时会给出“cannot convert from 'const int' to 'int *'”的错误提示。但有一个例外,可以将0赋值给指针变量,例如int*p, p=0;,这里是将p定义为空指针,以上语句相当于int*p, p=NULL;。
参考文献:
[1] Kenneth A. Reek著,许波译.C和指针[M].北京:人民邮电出版社,2008.
[2] 谭浩强.C程序设计(第四版)[M].北京:清华大学出版社,2010.
【学习C语言指针应注意的几个问题】相关文章: