博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
指针的指针
阅读量:7212 次
发布时间:2019-06-29

本文共 2669 字,大约阅读时间需要 8 分钟。

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=*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); }}

 

参考文章:

转载于:https://www.cnblogs.com/bluewelkin/p/4080767.html

你可能感兴趣的文章
只“存活”9个月:Ubuntu 15.10今日停止支持
查看>>
淘汰Hyper-V replication 拥抱Storage Replica
查看>>
云服务器 ECS 建站教程:部署Linux主机管理系统WDCP
查看>>
Win10 Edge浏览器续航碾压火狐/Chrome
查看>>
蓄电池知识14问答
查看>>
中国将成为全球 APT 攻击的第一目标国,去年就有36个组织干中国,SOS!
查看>>
丑闻频出,Verizon收购雅虎价格恐缩水10亿美元
查看>>
陌陌看好的移动营销 Criteo表示尚未成为主流
查看>>
科通联手中兴 共同制定未来物联网标准
查看>>
打造智能家居安防系统 七个选购常识你需懂
查看>>
支援日本/厄瓜多尔震区 Skype推免费通话
查看>>
转账给张三,钱却被李四收到,如何狙击凶险的 App 漏洞?——专访娜迦CTO玩命...
查看>>
有些车已经不能再买了!因为国五排放标准就要来了!
查看>>
怎样为企业挑选正确的EDR解决方案
查看>>
《编程原本 》一2.2 轨道
查看>>
社交媒体广告看不出来?Instagram加标签让你一目了然
查看>>
Facebook已经过时,蜂巢新网络崛起
查看>>
智能城市技术能够更好地改善日常生活
查看>>
大数据会如何影响VC领域?
查看>>
人力资源SaaS软件“乐才Joy HR”获数百万元战略融资
查看>>