首页 理论教育 C语言程序设计-指针数组和指向指针的指针

C语言程序设计-指针数组和指向指针的指针

时间:2023-11-23 理论教育 版权反馈
【摘要】:如果再定义一类变量,此变量专门用于保存指针变量的地址,就是说此变量是指向指针的指针变量,称为指向指针的指针。而parr[0]的类型是int*,是一个指向整型单元的指针,所以这里的指针数组名字parr实质上就是一个指向指针的指针。虽然在例7-15中parr可以作为二维数组名字使用,但是和二维数组名字arr的理解是不同的,arr被看作是保存一维数组的一维数组,是一个指向数组的指针,二者类型不同,不能相互赋值,希望同学们深入思考。

C语言程序设计-指针数组和指向指针的指针

1.指针数组

对于数组的概念大家非常熟悉,指针数组就是一个数组,它的每一个单元都相当于一个指针变量,可以保存一个地址值,其定义形式如下:

类型*数组名[数组长度];

比如定义数组:int* paar[4];

这里int*可以看成数组的基类型,说明每一个数组单元中可以存放一个整型单元的地址,也就是一个指向整型的指针;parr是数组的名字;数组长度为4,数组有4个单元,最多可以保存4个指向整型单元的指针。

指针数组多用在需要保存一批地址值的情况下,如果有一批相同类型的地址需要存储,则可以直接定义指针数组。

【例7-15】用指针数组访问二维数组。

程序中对于二维数组arr,arr[i]代表的是该数组中第i个单元中的一维数组的名字,是一维数组的起始地址,也就是&arr[i][0],因此它是一个指向整型单元的指针(指向的就是arr[i][0])。而数组parr每一个单元中都可以存放一个int*类型的指针,因此二者类型一致,可以赋值。当执行parr[i]=arr[i]赋值后,二者之间关系如图7-13所示。

图7-13 用指针数组访问二维数组

从图7-13可以看出,parr[i]中保存的就是arr[i],是第i行的起始地址,所以parr[i][j]代表的就是arr[i][j](parr[i]是第i个一维数组的数组名),当然也可以使用*(parr[i]+j)来表示arr[i][j],或者使用*(*(parr+i)+j)来表示arr[i][j],这都是可以的(二维数组中刚刚学过)。

2.指向指针的指针(www.xing528.com)

指针变量是用来保存其他变量的地址的内存单元,因此指针变量在内存中也有它自己的单元地址。如果再定义一类变量,此变量专门用于保存指针变量的地址,就是说此变量是指向指针的指针变量,称为指向指针的指针。其定义形式为:

类型**指针变量名;

例如:

int**p;

可以将此定义理解为int**p,p的前边有“*”,说明p是一个指针,而该指针中可以保存一个int*(指向整型单元的指针)的地址,所以p是一个指向指针的指针。

【例7-16】

pa是指向整型单元的指针,可以保存整型单元的地址,所以可以执行pa=&a;而ppa是指向指针的指针,可以保存指向整型单元的指针变量的地址,pa则是一个指向整型单元的指针变量,所以可以执行ppa=&pa。三者间的关系如图7-14所示。

图7-14 指针和指向指针的指针

由于pa=&a,则*pa是a的间接引用形式,代表的就是a;而ppa=&pa,所以*ppa是pa的间接引用形式,代表的就是pa,那么**ppa↔*(*ppa)↔*(pa)↔a。所以程序中输出*pa和**ppa的值就是整型变量a的值,因为它们都是变量a的间接内存引用形式。虽然看着挺复杂的,但对于指向指针的指针,其使用方法同任务7.1介绍的指针的基本使用方法是一致的,即指针变量是来保存内存单元地址的变量,通过在指针变量前加上星号,可以间接引用该地址所对应的内存单元。

再来回顾指针数组的概念,如图7-13所示,其中parr作为一维数组的名字,所代表的就是parr[0]的地址,因此parr是一个指向parr[0]的指针。而parr[0]的类型是int*,是一个指向整型单元的指针,所以这里的指针数组名字parr实质上就是一个指向指针的指针。虽然在例7-15中parr可以作为二维数组名字使用,但是和二维数组名字arr的理解是不同的,arr被看作是保存一维数组的一维数组,是一个指向数组的指针,二者类型不同,不能相互赋值,希望同学们深入思考。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈