美文网首页
搞定C指针---指向指针

搞定C指针---指向指针

作者: qwer2626 | 来源:发表于2020-06-18 15:14 被阅读0次

  一. 回顾指针概念:

  今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧!

  当我们程序如下申明变量:

  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的值。

  呵呵!不用我说太多了,我相信你应明白这种指针了吧!

  三. 一个应用实例

  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);

  依我在第五篇的分析方法,函数调用时会对每一个参数进行一个隐含的赋值操作。

  整个调用如下:

  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值的修改。

  你自行去调试。

  经过修改后的程序就可以完成所要的功能了。

下面给大家分享一下免费学习资料!

指针

http://www.makeru.com.cn/live/1392_238.html?s=156461

指针换装你还认识吗

http://www.makeru.com.cn/live/5413_2043.html?s=156461

相关文章

  • 搞定C指针---指向指针

    一. 回顾指针概念: 今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧! 当我们程序如...

  • [C++之旅] 16 对象指针/对象成员指针/this指针

    [C++之旅] 16 对象指针/对象成员指针/this指针 一、对象指针 对象指针指向堆中地址 对象指针指向栈中地...

  • C++ 指向类的指针

    原文地址:C++ 指向类的指针 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成...

  • 1.2.09_C++ 指向类的指针

    C++ 类 & 对象 一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算...

  • C++中的const和指针

    C++中的const可以与指针一起使用,通常可以归纳为3种:指向常量的指针,常指针,指向常量的常指针。 (1)指向...

  • C++ 用变量a给出下面的定义

    用变量a给出下面的定义:a) 一个整型数 b)一个指向整型数的指针 c)一个指向指针的的指针,它指向的指针是指向一...

  • 计算机基础的考察

    语言语法(以C/C++为例)。 指针(数组),函数指针,操作符运算顺序,const(常指针与指向常量指针),sta...

  • 带小白学C语言指针

    C语言里指针才是C语言的开始和指针;C语言里基本所有东西都是由指针演变而成; 指针是指向地址的变量,类型就是指针...

  • 1216笔记

    1216 C基础review: 二维数组 指针:一定要知道指针的指向,即指针指向哪里 指针的运算:注意移动字节数...

  • 空悬指针和野指针的区别

    空悬指针:指向的空间已被释放野指针:指针未被初始化(赋值) code by C

网友评论

      本文标题:搞定C指针---指向指针

      本文链接:https://www.haomeiwen.com/subject/bmeuxktx.html