`
haoningabc
  • 浏览: 1481929 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

指针的指针

    博客分类:
  • c
阅读更多
转自http://bbs.byr.cn/#!article/CPP/4470
发信人: kangkai810 (kangkai810), 信区: CPP 
标  题: 彻底搞定C指针---指向指针的指针(转) 
发信站: 北邮人论坛 (Fri Apr  4 11:32:54 2008), 站内 
  
一. 回顾指针概念: 
今天我们又要学习一个叫做指向另一指针地址的指针。让我们先回顾一下指针的概念吧! 
当我们程序如下申明变量: 
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值的修改。 
你自行去调试。 
经过修改后的程序就可以完成所要的功能了。 
分享到:
评论

相关推荐

    指针 指针教程 指针练习

    指针是C/C++编程语言中的核心概念,它在程序设计中扮演着至关重要的角色。指针是一个变量,其存储的是内存地址,该地址指向另一个变量。理解并熟练使用指针,是提升编程技能的关键步骤。 一、指针的基础概念 1. ...

    C_C++指针指针应用详解

    本文将深入探讨指针指针(指针的指针)的应用及其理解方法。 首先,我们要明白指针的基本构成和类型。一个指针声明通常由以下几个部分组成: 1. **指针的类型**:指针所指向的数据类型,如`int*`、`char*`等。 2. ...

    c++句柄,智能指针 指针间的区别

    "c++句柄、智能指针和指针的区别" 在C++编程中,句柄、智能指针和指针是三个相关但不同的概念。理解它们之间的区别对于初学者来说非常重要。 首先,让我们来讨论指针和句柄的区别。指针是指向物理内存地址的指针...

    c语言教程—指针指针指针

    C语言中的指针是其强大的特性之一,也是学习C语言的关键。指针允许程序员直接操纵内存地址,从而实现高效和灵活的编程。本教程将深入探讨指针的概念、使用和重要性。 首先,理解指针的基本概念至关重要。在计算机中...

    C语言指针函数和函数指针详细介绍.

    C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...

    指针 指针变量运算 指针数组相关

    指针变量运算与指针数组相关知识点 指针变量是C语言编程中一个非常重要的概念,它允许我们直接访问和操作内存中的数据。指针变量是存储了数据地址的一种变量,它可以是数组、字符串、函数或普通变量的地址。 1. ...

    指针指针数组多级指针动态指针PPT学习教案.pptx

    指针、指针数组和多级指针的概念与应用 在编程语言中,指针是非常重要的概念之一。指针是一种变量,它存储的是另一个变量的内存地址,而不是实际的值本身。通过指针,可以访问和操作内存中的数据。今天,我们将重点...

    指针

    指针 指针是一种保存变量地址的变量,是一种基本的计算机编程概念。它允许开发者直接访问和操作计算机内存中的变量,从而提供了更高的灵活性和控制力。 概念 在计算机中,内存是由存储单元构成的,每个存储单元...

    c语言指针总结 函数指针 指针函数

    ### C语言指针详解:函数指针与指针函数 #### 第十章 指针 **一、指针的基本概念** 指针是C语言中一个非常重要的概念,它允许程序员直接操纵内存地址,这对于提高程序效率至关重要。理解指针的基础概念是学好...

    函数指针和指针函数的理解

    ### 函数指针与指针函数的理解 #### 一、函数指针与指针函数的基本概念 在C语言中,函数指针和指针函数是两个重要的概念,它们经常出现在较为复杂的程序设计中,尤其在回调函数、动态绑定等场景中发挥着重要作用。...

    C++指针应用教学:让你不再害怕指针

    ### C++指针应用教学:让你不再害怕指针 #### 前言:复杂类型说明 在编程领域,特别是对于C++这样的强类型语言而言,理解指针的概念及其使用方式至关重要。指针作为C++中一种特殊的变量类型,能够直接操作内存地址...

    彻底理解指针,指针数组和数组指针,指针函数和函数指针

    ### 彻底理解指针,指针数组和数组指针,指针函数和函数指针 #### 一、基础知识 在计算机编程中,指针是一个非常重要的概念,尤其是在C/C++这样的语言中更是如此。简单来说,指针是一种变量,但它存储的不是普通的...

    易语言整数型转换到子程序指针

    在易语言编程中,"整数型转换到子程序指针"是一个常见的操作,涉及到程序设计中的类型转换和函数调用机制。易语言是一种以中文为语法的编程语言,旨在降低编程难度,让非计算机专业的人也能进行软件开发。在这个主题...

    C++指针探讨,关于C与C++函数指针指针函数

    在C++编程语言中,指针是一个至关重要的概念,它提供了对内存地址的直接操作,使得我们可以高效地处理数据和实现复杂的数据结构。本篇主要探讨C++中的指针,特别是涉及C与C++中函数指针和指针函数的使用。 首先,...

    非常经典详细的指针用法总结

    ### 指针详解 #### 一、理解复杂类型的规则 在编程中,尤其是C语言或C++等底层语言中,指针是一个重要的概念。掌握指针不仅能够帮助程序员更好地控制程序的行为,还能够提高代码的效率。对于初学者而言,理解和...

    让你不再害怕指针(c中指针的详解)

    ### 指针详解:不再畏惧C语言中的指针 #### 前言:理解复杂类型 在深入了解指针之前,我们首先需要掌握如何解析较为复杂的类型声明。这对于理解指针至关重要,因为指针本身的定义可能包含多个层级的复杂度。 ####...

    c语言彻底搞定C指针

    C语言中的指针是其强大的特性之一,也是学习C语言时的一大难点。本文将深入探讨C指针的概念、用途、操作及其潜在的陷阱,帮助你彻底掌握这一关键知识点。 一、指针的基本概念 指针在C语言中扮演着变量地址的角色,...

    让你不再害怕指针 指针介绍

    指针是C/C++等编程语言中的核心概念,它在程序设计中扮演着至关重要的角色。本文将深入探讨指针的定义、类型、运算以及如何有效地使用指针,旨在帮助初学者克服对指针的恐惧,提升编程技能。 首先,我们要理解指针...

Global site tag (gtag.js) - Google Analytics