黄国军
(黄冈职业技术学院计算机科学与技术系,湖北黄冈438002)
C++语言中指针变量与数组的关系剖析*
黄国军
(黄冈职业技术学院计算机科学与技术系,湖北黄冈438002)
C++语言中的指针变量和数组的关系非常密切。掌握指针变量与数组的关系是学好C++语言课程的难点,也是重点。就不同级别的指针变量与不同维数的数组之间的关系进行剖析,以便明确教学重难点。
指针变量;地址;数组
运用指针编程是C++语言最主要的风格之一,指针极大丰富了C++语言的功能。指针就是地址,指针变量是专门存放地址的变量;一个数组的数组名表示该数组在内存中存放的地址,地址就是指针,故数组名也是指针;在C++语言中能进行地址操作的除了指针变量外还有数组名。指针从级别上来讲常用的有一级指针、二级指针。一级指针每次加1表示下移一个基类型的字节数(列移动);二级指针每次加1表示下移一组基类型的字节数(行移动)。从性质来讲有常量指针与变量指针。常量指针就是数组名,它的值是不能改变的,不能放在赋值符号的左边。变量指针的值是允许被改变的,可以根据需要在程序的不同位置赋不同的值。为方便后面的讲述,现假设有如下定义语句:
从级别上来分,一级指针有pa和a;二级指针有pb、pc、pd和b。从性质来分常量指针有a、b、pc;变量指针有pa、pb、pd。下面分别就它们间的关系进行讨论。
pa是一级指针变量,它的值可以被改变;而a是一级指针常量,它始终代表数组a中首元素的地址,其值不能改变。当通过语句pa=a或pa=&a [0]让指针变量pa与一维数组a建立了如图1所示关系。
图1一级指针变量pa与一维数组a
对数组a中第i(0≤i≤4)个元素的访问有四种形式a[i]、pa[i]、*(a+i)和*(pa+i)。它们之间是等价关系,可以相互替换。p是一个指针变量,它可以通过与自增运算符++或自减运算符——相结合来访问所指数组中的每一个元素;而a是一个指针常量,故不能。对数组a中第i个元素的地址的表示有a+i与p+i两种表示形式。由于指针变量pa与数组名a都是一级指针,只要pa始终指向数组a的首元素,它们的关系是等价的,在出现数组名a的地方都可以用pa替换。
一级指针变量pa可以访问二维数组b。二维数组b中的元素在内存中是按行存放的,它首先按从左到右的顺序在内存中存放第一行的元素后,再按从左到右的顺序存放第二行元素,如图所示:b [0][0]的下一个元素是b[0][1],b[0][3]的下个元素是b[1][0]。当通过语句pa=b或pa=&b[0] [0]让一级指针变量pa指向二维数组b的首元素后,它们的关系如图2所示。
对二维数组b中第i(0≤i≤2)行j(0≤j≤3)列元素的访问有b[i][j]、pa[i*4+j]、*(*(b+i)+ j)和*(pa+i*4+j)四种形式。在通过键盘给数组b中的逐个元素格式化赋值时,访问的是它们的地址;对数组b中第i(0≤i≤2)行j(0≤j≤3)列元素的地址的表示有*(b+i)+j、b[i]+j、p+i*4+ j三种表示形式。由于pa是一级指针而b是二级指针,一个是按列移动,另一个按行移动,它们是不等价的,这就决定了在数组名b出现的地方如果用pa来替换必须进行一定的处理。
图2一级指针变量pa与二维数组b
C++语言中,二级指针变量与二维数组名都是二级指针。它们之间能否建立关系的首要条件要看二级指针变量能否确定它所指向二维数组的列宽,次要条件是二级指针变量所指的一维数组的元素个数与二维数组的列宽是否相等,两者缺一不可。
二级指针变量有指向指针的指针变量pb和指向一维数组的指针变量pd。二级指针变量pb一般存放另一个一级指针变量的地址。因为二级指针变量pb不能确定它所指向的二维数组的列宽,所以它不能与一个二维数组建立指向关系。
图3指向一维数组的指针变量pd与二维数组b
从上面的定义可以看出指向一维数组的指针变量pd所指一维数组含有4个元素,二维数组b中的列宽为4。可以通过语句pd=b或pd=&b[0] [0]让一维数组的指针变量pd与二维数组b建立指向关系。对二维数组b中第i(0≤i≤2)行j(0≤j≤3)列元素的访问有①b[i][j]②pd[i][j]③*(*(b+i)+j)④*(*(pd+i)+j))四种形式。在通过键盘给数组b中的逐个元素格式化赋值时,访问的是它们的地址;对数组b中第i(0≤i≤2)行j(0≤j≤3)列元素的地址的表示有*(b+i)+j、b[i] +j、*(pd+i)+j、pd[i]+j三种表示形式。pd和b都是二级指针,都是按列移动,它们是等价的,如果pd始终指向数组b的首首行,则在数组名b出现的地方都能用用pd替换,它们是等价的。
通过上述对指针变量与数组关系的分析,其结果可以归纳如下:当一级指针变量指向一维数组首元素后,只要不改变指针变量的值,所有要一维数组名出现的地方都能用指针变量名替换,它们间是等价的。当一级指针变量指向二维数组的首元素后,由于级别的不同(一个列移动,一个是行移动),这就决定了在数组名出现的地方如果用一维指针来替换必须进行一定的处理,它们间是不等价的。二级指针变量与二维数组名都是二级指针。它们之间能否建立关系的首要条件要看二级指针变量能否确定它所指向二维数组的列宽,次要条件是二级指针变量所指的一维数组的元素个数与二维数组的列宽是否相等,两者缺一不可。
[1]崔武子.C++语言程序设计[M].北京:清华大学出版社,2008-02.
[2]向华.C++语言程序设计[M].北京:清华大学出版社,2008-06.
Analysis on Relationship between Pointer V ariables and Arrays in C++Language
HUGNG Guo-jun
(Huanggang Polytechnic College,Huanggang438002Hubei)
The relationship between the pointer variable and array is very closely related in C++language.It is the difficult point to master the relationship between the variables and arraysfor learning C++language well,which is also key point.In order to clarify the importance and difficulties in teaching,the author analyzed the relationship between the pointer variables of different levels and different dimensions of the arrays.
Pointer variables;Address;Array
TP314
A
1672-1047(2010)03-0009-02
10.3969/j.issn.1672-1047.2010.03.03
[责任编校:郭杏芳]
2010-4-20
黄国军(1972-),男,硕士,讲师。hgjcpp@hgpu.edu.cn