漫谈C指针:一个指针应用实例

学会调试指针传递的方法
服务器君一共花费了221.310 ms进行了5次数据库查询,努力地为您提供了这个页面。
试试阅读模式?希望听取您的建议

设计一个函数:void find1(char array[], char search, char *pa)

要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search里的字符。如果找到,函数通过第三个参数(pa)返回值为array字符串中第一个找到的字符的地址。如果没找到,则为pa为0。

设计:依题意,实现代码如下。

#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;
        }
    }
}

你觉得这个函数能实现所要求的功能吗?

调试:

我下面调用这个函数试试。

main()
{
    char str[] = {"afsdfsdfdf\0"}; /* 待查找的字符串 */
    char a = ’d’; /* 设置要查找的字符 */
    char *p = 0; /* 如果查找到后指针p将指向字符串中查找到的第1个字符的地址。 */
    find1(str, a, p); /* 调用函数以实现所要操作。 */
    if (0 == p)
    {
        printf("没找到!\n"); /* 如果没找到则输出此句 */
    }
    else
    {
        printf("找到了,p = %d", p); /* 如果找到则输出此句 */
    }
    return(0);
}

上面代码,你认为会是输出什么呢?运行试试。

唉!怎么输出的是:没有找到!而不是“找到了,……”。

明明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值的修改。你自行去调试

经过修改后的程序就可以完成所要的功能了。看懂了这个例子,也就达到了本篇所要求的目的。

延伸阅读

此文章所在专题列表如下:

  1. 漫谈C指针:C语言变量的实质
  2. 漫谈C指针:变量赋值与取地址
  3. 漫谈C指针:指针是什么东西
  4. 漫谈C指针:指针与数组
  5. 漫谈C指针:声明指针常量
  6. 漫谈C指针:从const int i说起
  7. 漫谈C指针:const int *pi的语义
  8. 漫谈C指针:参数传递的三道题目
  9. 漫谈C指针:参数的值传递
  10. 漫谈C指针:参数的地址传递
  11. 漫谈C指针:参数的引用传递
  12. 漫谈C指针:回顾指针概念
  13. 漫谈C指针:指向另一指针地址的指针
  14. 漫谈C指针:一个指针应用实例
  15. 漫谈C指针:函数名其实也是指针
  16. 漫谈C指针:函数调用的指针写法
  17. 漫谈C指针:定义函数的指针类型
  18. 漫谈C指针:函数指针作为函数参数使用

本文地址:http://www.nowamagic.net/librarys/veda/detail/2132,欢迎访问原出处。

不打个分吗?

转载随意,但请带上本文地址:

http://www.nowamagic.net/librarys/veda/detail/2132

如果你认为这篇文章值得更多人阅读,欢迎使用下面的分享功能。
小提示:您可以按快捷键 Ctrl + D,或点此 加入收藏

大家都在看

阅读一百本计算机著作吧,少年

很多人觉得自己技术进步很慢,学习效率低,我觉得一个重要原因是看的书少了。多少是多呢?起码得看3、4、5、6米吧。给个具体的数量,那就100本书吧。很多人知识结构不好而且不系统,因为在特定领域有一个足够量的知识量+足够良好的知识结构,系统化以后就足以应对大量未曾遇到过的问题。

奉劝自学者:构建特定领域的知识结构体系的路径中再也没有比学习该专业的专业课程更好的了。如果我的知识结构体系足以囊括面试官的大部分甚至吞并他的知识结构体系的话,读到他言语中的一个词我们就已经知道他要表达什么,我们可以让他坐“上位”毕竟他是面试官,但是在知识结构体系以及心理上我们就居高临下。

所以,阅读一百本计算机著作吧,少年!

《重构:改善既有代码的设计》 福勒(Martin Fowler) (作者), 熊节 (译者)

《重构:改善既有代码的设计》清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式,并给出了何时以及何地应该开始挖掘代码以求改善。书中给出了70多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。《重构:改善既有代码的设计》提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。

更多计算机宝库...