山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为指向指针的指针。
怎样定义一个指向指针数据的指针变量呢?下面定义一个指向指针数据的指针变量:
char * * p ;
P的前面有两个*号。*运算符的结合性是从右到左,因此* * p相当于* ( *p ),显然*p是指针变量的定义形式。如果没有最前面的*,那就是定义了一个指向字符数据的指针变量。现在它前面又有一个*号,即char * * p。可以把它分为两部分看,即:char*和( *p ),后面的( * p )表示p是指针变量,前面的char *表示p指向的是char型的数据。也就是说,p指向一个字符指针变量(这个字符指针变量指向一个字符型数据)。如果引用xp,就得到p所指向的字符指针变量的值,如果有:
p = name + 2 ;
printf ( " % d\n”,* p );
printf ( " % s\n ",* p );
第1个printf函数语句输出name [ 2 ]的值(它是一个地址),第2个printf函数语句以字符串形式( % s )输出字符串“Great Wall”。
例题:
使用指向指针数据的指针变量。
解题思路:
定义一个指针数组name,并对它初始化,使name数组中每一个元素分别指向5个字符串。定义一个指向指针型数据的指针变量p,使p先后指向name数组中各元素,输出这些元素所指向的字符串。
编写程序:
运行结果:
程序分析:
p是指向char*型数据的指针变量,即指向指针的指针。在第1次执行for循环体时,赋值语句“p = name + i;”使p指向name数组的0号元素name [ 0 ],* p是name [ 0 ]的值,即第1个字符串首字符的地址,用printf函数输出第1个字符串(格式符为%s)。执行5次循环体,依次输出5个字符串。
例题2:
有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。
编写程序:
运行结果:
程序分析:
程序中定义p是指向指针型数据的指针变量,开始时指向指针数组num的首元素num [ 0 ],而num [ 0 ]是一个指针型的元素,它指向整型数组a的首元素a [ 0 ]。开始时p的值是& num [ 0 ],*p是num [ 0 ]的值,即&a [ 0 ],* ( *p )是a [ 0 ]的值。因此第1个输出的是a [ 0 ]的值1。然后执行p + +,p就指向num[1]再输出* *p,就是a [ 2 ]的值3了。请不要把第3和第4行错写为
int * num [ 5 ] = ( 1,3 , 5 , 7 , 9 );
指针数组的元素只能存放地址,不能存放整数。
“间接访问”变量的方式。利用指针变量访问另一个变量就是“间接访问”。如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”,指向指针数据的指针用的是“二级间址”方法,从理论上说,间址方法可以延伸到更多的级,即多重指针,但实际上在程序中很少有超过二级间址的。级数愈多,愈难理解,容易产生混乱,出错机会也多。