首页 > 代码库 > 指针的指针

指针的指针

1、

short int i;
char a;
short int * pi;

i=50;
pi=&i;

----------------指针的指针,浓重出厂

short int * * ppi;    //这是一个指向指针的指针,注意有两个*号
ppi=π

 

------

结果:

ppi是pi的地址值

*ppi 是 pi地址值里面的内容,也就是 i的地址值。 *ppi(等价于pi,前面有声明ppi=π 前面加个*号,双重否定)

**ppi 就是i的内容。(因为*ppi=pi,所以**ppi=*pi=i)

2、例二:

#include "stdio.h"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;      }   }}int main(){  char str[]={"afsdfsdfdf\0"};  //待查找的字符串  char a=d;  //设置要查找的字符  char *p=0;  //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。  find1(str,a,p);  //调用函数以实现所要操作。  if (0==p )  { printf("没找到");  }  else  {     printf("找到了,p=%d",p);  }}

 

上面代码,你认为会是输出什么呢?
运行试试。
唉!怎么输出的是:没有找到!
而不是:找到了,……。
明明a值为’d’,而str字符串的第四个字符是’d’,应该找得到呀!
再看函数定义处:void find1(char [] array, char search, char * pa)
看调用处:find1(str,a,p);
依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。
整个调用如下:
   array=str;
   search=a;
   pa=p;    //请注意:以上三句是调用时隐含的动作。//个人总结,  看函数的接口部分:Exchg2(int *px,int *py),请注意:参数px,py都是指针。
                                                                                                 // 再看调用处:Exchg2(&a, &b)   int i; 等价于px=&a;py=&b;
                          //它将a的地址(&a)代入到px,b的地址(&b)代入到py。同上面的值传递一样,函数调用时作了两个隐含的操作:将&a,&b的值赋值给了px,py。
   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的指向并没有被改变)。
(如果还有疑问,再看一看《第五篇:函数参数的传递》了。)

修正版:

#include "stdio.h"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;      }   }}int main(){  char str[]={"afsdfsdfdf\0"};  //待查找的字符串  char a=d;  //设置要查找的字符  char *p=0;  //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。  find1(str,a,&p);  //调用函数以实现所要操作。  if (0==p )  { printf("没找到");  }  else  {     printf("找到了,p=%d",*p);  }}

 

完整分析版:

#include "stdio.h"void find1(char array[], char search, char *pa) {   int i;                                      // 注意,不是 *pa=&p; 而是 pa=&p,*pa=p。                                         // 如果上面参数是*pa,那么pa=p,只是p的一个副本而已  pa是p的内容,所以*pa指向以内容为地址的地方,内容不知道是多少    for (i=0;*(array+i)!=0;i++)   {      if (*(array+i)==search)      {        *pa=array+i;        break;      }      else if (*(array+i)==0)      {        *pa=0;        break;      }   }}int main(){  char str[]={"afsdfsdfdf\0"};  //待查找的字符串  char a=d;  //设置要查找的字符  char *p=0;  //如果查找到后指针p将指向字符串中查找到的第一个字符的地址。  find1(str,a,&p);  //调用函数以实现所要操作。  if (0==p )  { printf("没找到");  }  else  {     printf("找到了,p=%d",*p);  }}

 

参考文章:http://blog.pfan.cn/whyhappy/5790.html

指针的指针