指针的指针

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"};  //待查找的字符串
  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"};  //待查找的字符串
  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=*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"}; //待查找的字符串 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

原文地址:https://www.cnblogs.com/bluewelkin/p/4080767.html