zoukankan      html  css  js  c++  java
  • 指针的指针

    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

  • 相关阅读:
    .NET 统一用户管理 -- 统一鉴权
    .NET 统一用户管理 -- 单点登录
    基于.net 职责链来实现 插件模式
    电商开放平台设计
    docker搭建一个渗透测试环境 bwapp为例
    dcoker运行msf
    关于构造靶场
    判断网站是不是真实ip
    H3C设备配置ARP攻击防御
    Java代码审计 HTTP头操纵 response.addHeader()
  • 原文地址:https://www.cnblogs.com/bluewelkin/p/4080767.html
Copyright © 2011-2022 走看看