漫谈C指针第十四讲---一个指针应用实例

设计一个函数: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值的修改!!!!!。你自行去调试。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值