当前位置:天才代写 > tutorial > C语言/C++ 教程 > 彻底搞定C语言指针 第六篇

彻底搞定C语言指针 第六篇

2017-11-03 08:00 星期五 所属: C语言/C++ 教程 浏览:417

副标题#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值的修改。

你自行去调试。

颠末修改后的措施就可以完 成所要的成果了。

看懂了这个例子,也就到达了本篇所要求的目标。

 

    关键字:

天才代写-代写联系方式