APP下载

C语言中指针的应用分析

2013-01-11

太原城市职业技术学院学报 2013年1期
关键词:数组赋值指针

杨 杰

(山西职业技术学院,山西 太原 030006)

C语言是一种基本的程序设计语言,它包含了很多数据类型,其中指针是它的精髓,可以表示并实现非常复杂的数据结构。在应用C语言编程时,指针的使用频率较高,有时甚至是解决问题的唯一途径,而且可以通过应用指针来提高程序的运行速度。因此,是否能够准确灵活地应用指针,是应用C语言编程的一个关键。

一、指针概念

在计算机中,所有的数据都是存放在存储器中的,一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等。如整型量占两个单元,字符量占一个单元等。为了正确地访问这些内存单元,必须为每个内存单元编上号。根据一个内存单元的编号,即可以准确地找到该内存单元。内存单元的编号也叫地址。根据内存单元的地址,就可以找到所需的内存单元,所以通常也把这个地址称为指针。

二、常用的指针类型

1.基本类型指针

基本类型指针所指的数据类型是简单的数据类型,可以是整型、实型、字符型。

上例中,定义了一个整型变量p1以及一个整型数据的指针p,并把整型变量p1的内存单元的地址(&p1)赋值给了整型数据指针p。

2.指向数组的指针

该指针所指的数据类型是一个数组,该数组可以是一维数组、二维数组或多维数组。

上例中,定义了一个整型的一维数组str,还定义了一个整型数据的指针p1,最后又把数组名str赋值给了指针p1,对于一个一维数组来说,数组名str表示该数组中第一个元素str[0]的地址,即该数组的首地址。也就是说相当于把数组str的首地址&str[0]赋值给了整型指针p1。

3.二级指针

二级指针也就是指指针变量所指向的是某一个指针的地址。

上例中,定义了一个整型变量score,一个整型指针p1,又定义了一个二级指针pp。之后把整型变量score的地址赋值给了一级指针p1,即p1中存放的是整型变量score的首地址。最后又将一级指针p1的地址赋值给了二级指针pp,即二级指针pp中存放的是一级指针p1的地址。如果将二级指针pp的地址赋值给某一个指针的话,该指针就为三级指针。同理,可以派生出多级指针。

4.指向函数的指针

指向函数的指针就是指指针变量所指向的是函数的首地址,因此可以通过引用该指针变量来调用该函数。

上例中定义了一个整型指针f,该指针变量指向一个函数,也就是存放了该函数在内存中的存储地址。定义了一个函数p,p中定义了两个整型变量作为参数,并且返回值也为整型。最后将函数p赋值给了指针f,f指向函数p,也就是将函数p的首地址赋值给了指针f。

5.指针数组

指针数组就是指该数组的数组元素是由指针变量构成的。即每一个数组元素都是一个指针。

上例中,定义了一个指针pa,该指针指向的是一个有五个元素的数组,并且该数组的每一个元素都是整型变量。又定义了一个整型数组arr,有五个数组元素;最后将arr赋值给了pa,也就是将一个整型数组arr的地址赋值给了一个整型数组的指针怕。满足赋值关系左右两边应该保持一致性的条件。

6.结构体类型指针

结构体类型指针和基本数据类型指针变量类似,主要就是用来存储结构体类型变量的地址以及结构体类型数组的地址,因此,我们可以采用间接方式来对对应的变量与数组进行操作。C语言中,结构体类型指针变量能够参与“+”“*”“++”“--”“,”“.”“,”“->”“&|”等运算符的运算。

上例中,首先定义了一个结构体类型struct Teacher,在该结构体中定义了一个整型变量num和字符型数组name,之后定义了一个结构体类型struct Teacher的指针pa,以及该结构体变量m,并将m的地址赋值给了指针pa,指针pa表示的是一个包含4个字节的地址,而结构体变量m则表示是一个占有24个字节的实际存在的结构体内容。

三、指针在应用过程中常见的错误分析

1.指针变量的类型未事先声明

与简单变量一样,指针变量在使用之前必须进行声明。声明的格式为:类型标识符 *变量名;表示定义了一个指针变量,并且说明了本指针变量指向变量的数据类型。值得注意的是,一个指针变量只能指向与它类型相同的变量。

2.使用未进行初始化的指针

如果一个指针没有进行初始化的话,它的值是不确定的,也就是说,它的指向是不确定的。如果使用这样的指针可能会给系统带来灾难性的后果,系统不能正常运行。

在上例中,指针pa未进行初始化,应该在循环语句for语句之前加上一条“pa=s”语句,从而初始化pa。

3.错误的指针赋值

我们知道,指针变量存放的是一个内存单元的地址,因此它的值只能是正整数,决不能是一个负数,和整数类型变量是有其区别的。

上例中,“pa=a1;”是一条错误的赋值语句,应改为“pa=&a1;”。

上例中,“pt=student();”语句是将student()函数的函数值赋值给指针变量pt,应直接用函数名,应改为“pt=student;”。

4.指针的运算错误

在定义函数时,循环结构中使指针指向下一结点的语句错误。

其中w指向的是一个链表中的某个结点,是动态分配的,不一定连续,而w++只有当w指向连续的存储空间时,w才指向下一元素。因此,用w++来表示下一个结点是不合适的。

5.数组中错误使用指针变量

在指针运算中,我们可以通过取内容*运算来得到数值,对于一个m级指针来说,进行m次取内容*运算后得到的为数值,而进行0到m-1次取内容运算结果都是地址。

上例中,a是一个二维数组名,与二级指针类似,*a表示地址,**a则表示整型数据。数组名a不能够表示数组元素的首地址,而是表示有三个元素的第0行的地址,所以在编译时会出现错误。应改为:p1=&a[0][0]或者p1=a[0]。

指针数据类型的应用是C语言的精髓,论文仅仅分析了指针的一些常用形式,以及在应用指针完成简单程序编写的过程中,容易出现的一些典型错误,希望能使初学者更好地熟悉指针,并能更灵活地应用指针完成简单程序编写。

[1]温娟娟.C语言中指针的探讨[J].河南职业技术师范学院学报,2003,(3).

[2]高宏娟.C语言中“指针”的教学方法探讨[J].科技信息,2011,(8).

[3]刘军.C程序设计教学探讨[J].电脑知识与技术,2011,(18).

[4]谭浩强.C程序设计[M].北京:清华大学出版社,2005.

猜你喜欢

数组赋值指针
JAVA稀疏矩阵算法
垂悬指针检测与防御方法*
JAVA玩转数学之二维数组排序
强赋值幺半群上的加权Mealy机与加权Moore机的关系*
更高效用好 Excel的数组公式
为什么表的指针都按照顺时针方向转动
算法框图问题中的易错点
利用赋值法解决抽象函数相关问题オ
寻找勾股数组的历程
浅析C语言指针