副标题#e#
指向另一指针的指针
一、针观念:
早在本系列第二篇中我就对指针的实质举办了叙述 。本日我们又要进修一个叫做指向另一指针地点的指针。让我们先回首一下指针的观念吧!
当我 们措施如下申明变量:
short int i;
char a;
short int * pi;
措施会 在内存某地点空间上为各变量开发空间,如下图所示。
内存地点→6 7 8 9 10 11 12 13 14 15
——————- ——————————————————————
… | | | | | | | | | |
————————————— ———————————————-
|short int i |char a| |short int * pi|
图中所示中可看出:
i 变量在内存地点5的位置,占两个字节。
a变量在内存 地点7的位置,占一个字节。
pi变量在内存地点9的位置,占两个字节。(注:pi 是指针,我这 里指针的宽度只有两个字节,32位系统是四个字节)
接下来如下赋值:
i=50;
pi=&i;
颠末上在两句的赋值,变量的内存映象如下:
内存地点→6 7 8 9 10 11 12 13 14 15
—– ———————————————————————————
… | 50 | | | 6 | | | |
———– —————————————————————————
|short int i |char a| |short int * pi|
看到没有:短整型指针变量pi的值为6,它就是I变量的内 存起始地点。所以,这时当我们对*pi举办读写操纵时,其实就是对i变量的读写操纵。如:
*pi=5; //就是等价于I=5;
你可以回看本系列的第二篇,哪里有越发具体的讲解。
二、指针的地点与指向另一指针地点的指针
在上一节中,我们看到,指针变量自己与其 它变量一样也是在某个内存地点中的,如pi的内存起始地点是10.同样的,我们也大概让某个指针指向这 个地点。
看下面代码:
short int * * ppi; //这是一个指向指针的指针,留意 有两个*号
ppi=π
第一句:short int * * ppi;——申明白一个指针变量 ppi,这个ppi是用来存储(或称指向)一个short int * 范例指针变量的地点。
第二句: &pi那就是取pi的地点,ppi=π就是把pi的地点赋给了ppi.即将地点值10赋值给ppi.如下图:
内存地点→6 7 8 9 10 11 12 13 14 15
———————————————————————— ————
… | 50 | | | 6 | 10 | |
———————————————————————————- —
|short int i|char a| |short int * pi|short int ** ppi|
从图中看出,指针变 量ppi的内容就是指针变量pi的起始地点。于是……
ppi的值是几多呢? ——10.
*ppi的值是几多呢?——6,即pi的值。
**ppi的值是几多 呢?——50,即I的值,也是*pi的值。
呵呵!不消我说太多了,我相信你应大白这种 指针了吧!
#p#副标题#e#
三、一个应用实例
1. 设计一个函数:void find1(char array[], char search, char * pi)
要求:这个函数参数中的数组array是以0值为竣事的字符串,要求在字符 串array中查找字符是参数search里的字符。假如找到,函数通过第三个参数(pa)返回值为array字符 串中第一个找到的字符的地点。假如没找到,则为pa为0.
设计:依题意,实现代码如下
void find1(char [] array, char search, char * pa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
pa=array+i
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
}
你以为这个函数能实现所要求的成果吗?
调试:
我下面挪用这个函数 试试。
void main()
{
char str[]={“afsdfsdfdf\0”}; //待 查找的字符串
char a=’d’; //配置要查找的字符
char * p=0; //假如 查找到后指针p将指向字符串中查找到的第一个字符的地点。
find1(str,a,p); //挪用函数以实 现所要操纵。
if (0==p )
{
printf (“没找到!\n”);//1.假如没找到则 输出此句
}
else
{
printf(“找到了,p=%d”,p); //假如找到则 输出此句
}
}
阐明:
上面代码,你认为会是输出什么呢?
运 行试试。
唉!怎么输出的是:没有找到!
而不是:找到了,……。
显着a值为‘d’,而str字符串的第四个字符是‘d’,应该找获得呀!
再 看函数界说处:void find1(char [] array, char search, char * pa)
看挪用处:find1( str,a,p);
依我在第五篇的阐明要领,函数挪用时会对每一个参数举办一个隐含的赋值操纵 。
整个挪用如下:
#p#分页标题#e#
array=str;
search=a;
pa=p; //请留意:以 上三句是挪用时隐含的行动。
int i;
for (i=0;*(array+i)!=0;i++)
{
if (* (array+i)==search)
{
pa=array+i
break;
}
else if (*(array+i)==0)
{
pa=0;
break;
}
}
哦!参数pa与参数search的通报并没 有什么差异,都是值通报嘛(小语:地点通报其实就是地点值通报嘛)!所以对形参变量pa值(虽然值 是一个地点值)的修改并不会改变实参变量p值,因此p的值并没有改变(即p的指向并没有被改变)。
(假如尚有疑问,再看一看《第五篇:函数参数的通报》了。)
批改:
void find2(char [] array, char search, char ** ppa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i)==search)
{
*ppa=array+i
break;
}
else if (*(array+i)==0)
{
*ppa=0;
break;
}
}
}
主函数的挪用处改如下:
find2(str,a, &p); //挪用函数以实现所要操纵。
再阐明:
这样挪用函数时的整个操纵酿成如 下:
array=str;
search=a;
ppa=&p; //请留意:以上三句是挪用 时隐含的行动。
int i;
for (i=0;*(array+i)!=0;i++)
{
if (*(array+i) ==search)
{
*ppa=array+i
break;
}
else if (*(array+i)==0)
{
*ppa=0;
break;
}
}
看大白了吗?
ppa指向指针p的地点 。
对*ppa的修改就是对p值的修改。
你自行去调试。
颠末修改后的措施就可以完 成所要的成果了。
看懂了这个例子,也就到达了本篇所要求的目标。