论文导读:C语言的一大特点就是数据类型丰富,其中一个重要的数据类型就是指针,它也是C语言的精华所在。利用指针可以有效的表示复杂的数据结构,实现动态内存分配,更灵活、方便的使用数组、字符串,还能实现为函数间各类数据的传递提供简洁便利的方法。根据变量的类型,内存为其分配相应的存储空间如图所示,由于变量a是字符型,所以内存为其分配1个字节的存储单元,变量b是基本整型,内存为其分配2个字节的存储单元,变量c是浮点型,内存为其分配4个字节的存储单元。
关键词:C语言,指针,内存
1 引言
C语言的一大特点就是数据类型丰富,其中一个重要的数据类型就是指针,它也是C语言的精华所在。利用指针可以有效的表示复杂的数据结构,实现动态内存分配,更灵活、方便的使用数组、字符串,还能实现为函数间各类数据的传递提供简洁便利的方法。熟练掌握指针的应用,可以使程序简洁、紧凑和高效。
2 指针的概念
要想了解什么是指针,就必须弄清楚数据在内存中是如何存储的,内存是以字节为单位的一片连续的存储空间,每一个字节单元对应着一个唯一的编号,这个编号被就称为内存单元的地址,相当于宾馆的房号一样,在地址所标识的内存单元中存放数据,就相当于房间里入住的客人一样。若有如下定义:
char a;
int b;
float c;
根据变量的类型,内存为其分配相应的存储空间如图所示,由于变量a是字符型,所以内存为其分配1个字节的存储单元,变量b是基本整型,内存为其分配2个字节的存储单元,变量c是浮点型,内存为其分配4个字节的存储单元。内存为变量分配存储空间的首个字节单元的地址称为该变量的地址。如a的地址是1000,b的地址是1001,c的地址是1003。由此可见,地址就是用来标识每一个存储单元的,以方便用户对存储单元中的数据能够正确访问,在高级语言中就形象的将地址称为指针。指针可以用来指向变量、数组及其元素、结构体、和指针(称为多级指针)等,但不能用指针来指向表达式、常量、和寄存器变量等,因为这些对象没有地址的概念。
3 指针变量的定义和初始化
在C语言中规定,所有的变量必须先定义,后使用,对于指针变量,也不例外,其定义形式如下:
类型标识符 *指针变量名
例如:
char *a; /*定义一个指向字符型变量的指针变量a*/
int *b; /*定义一个指向整型变量的指针变量b*/
flaot *c; /*定义一个指向浮点型变量的指针变量c*/
需要注意的是,在定义指针变量时的*仅仅只是一个说明符,表面其后所定义的变量是一个指针变量。
既然指针是一种变量,那么就应该和其他变量一样,在定义的同时也可初始化。论文参考。例如:
char a=5,*b=&a;
这里由于指针变量b是指向字符型变量a的,所以在定义时,指针变量b的类型要与它所指向变量的类型一致,而“&”是一个取地址运算符,&a就来表示变量a的地址。通过对指针变量初始化,建立起指针变量b的指向,如图2所示。系统为指针变量b分配的存储空间地址是4100,b中存放的是变量a的地址,即1000,当需要读取变量a的值时,如果直接按变量名a的方式,就是对内存单元的直接存取方式,现在既然指针变量b是指向变量a的,那么也就可以先通过指针变量b得到b的值1000,即a的地址,再根据地址1000读取它所指向存储单元的值5。论文参考。这种间接的通过变量b得到变量a的地址,然后在存取变量a的值的方式就称为间接存取方式。
4 指针运算符
“*”运算符称为指针运算符,“&”是地址运算符,二者可以看作是一对互逆运算符。“&”的作用在前面已经说明,这里不再赘述。而“*”的作用是取其指向变量的内容(不是地址,是地址对应存储单元的值)。例如有如下程序段:
int i=3,j=4,k,*p,*q;
p=&i;
q=&j;
k=*p**q;
在这个程序段中多次使用到了“*”,要想得出k的结果,就要区分出每个地方出现的“*”所表示的含义,在定义时p和q前的“*”的作用只是用来标识这两个变量是指针变量,接下来通过将变量i的地址赋给p,变量j的地址赋给q,建立起指针变量p和q的指向,最后就是求解k的值了,在这条语句中出现了三个“*”,其中p和q前的“*”均是指针运算符,也就是用来分别去p、q所指向变量i、j的内容,即就是3和4,剩下的“*”则表示乘运算,所以求得k值为12。由此可见,要想得出正确的结果,首先要分清“*”在每一处的作用,为了方便解题,给出两个等价转换关系,供大家使用:
①i=*p=*(&i)
②p=&i=&(*p)
5 指针运算
常用的指针运算主要有三种:赋值运算,关系运算和算术运算。
首先对于赋值运算,前面的例子中已经见过,如:b=&a,p=&i。需要注意的就是不能够将一个常量地址赋给指针变量,如:int *p;p=1000;也不能让指针变量指向与它类型不相同的变量,如:int *p;float i;p=&i;
其次指针也可以进行关系运算,但在进行关系运算之前,指针必须先建立指向关系,即指针有初值,另外,只有相同类型的指针才能进行比较。
最后,指针也可以进行算术运算,对一个指针加、减一个整数n是,并不是用指针值直接加、减n,而是与指针的数据类型有关,若用公式表示即为:指针变量值±n×sizeof(指针类型),例如:
int a=1,b=2,c=3,*p=&a;
假设内存为a、b、c3个变量分配在了一个连续的存储区域内,a的地址为1000, p指向变量a,即p的内容是1000,如图3所示。执行p=p+2后,表示指针向下移动两个整型变量的位置,如图4所示,p的值为1000+2*sizeof(int)=1000+2×2=1004,而不是1002。利用指针的这一特点,指针被大量的使用在数组中,从而在访问数组元素时更加灵活,快捷。
6 总结
本文中介绍了指针的基本概念和初步应用,由于指针式C语言中一个重要的概念,也是C语言的一大特色,使用指针可以提高程序的效率,可以实现动态存储分配,也可以在调用函数时变量改变了的值能够为主调函数使用。论文参考。但是同时由于指针使用过于灵活,使用起来很容易出错,而且这种错误往往比较隐蔽,难于发现,所以在使用指针时要仔细小心,最好通过上机调试程序,弄清每一个细节,累积编程经验。
7 参考文献
[1]谭浩强. C程序设计(第三版)[M].清华大学出版社. 2005
[2]宗大华、蒋玮. C语言程序设计[M].人民邮电出版社. 2003
[3]黄维通,马力妮. C语言程序设计[M]. 北京:清华大学出版社. 2003
|