为什么使用二级指针

设计一个函数:

void find1(char array[], char search, char *pa) 

要求: 这个函数参数中的数组array是以\0值为结束的字符串,要求在字符串array中查找与参数search给出的字符相同的字符。如果找到,通过第三个参数(pa)返回array字符串中首先碰到的字符的地址。如果没有找到,则为pa为NULL。


依题意,实现代码如下。

void find1(char [] array, char search, char *pa)
{
    for (int i = 0; *(array + i) != '\0'; ++i)
    {
        if (*(array + i) == search)
        {        
            pa == array + i;    // pa得到某元素的地址
            break; 
        }
    }
}

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

下面调用这个函数试试

int main(int argc, char *argv[])
{
    char str[] = "abcdefdfefde";    // 待查找的字符串
    char a = 'd';    // 设置要查找的字符
    char *p = NULL;    // 先置为空
    find1(str, a, p);    // 调用函数以实现查找操作
    if (NULL == p)
    {
        cout << "Not found!" << endl;
    }
    else
    {
        cout << "found it!" << endl;
    }        
     
    return 0;
}

运行结果是Not found!        Why?!

分析:  先看函数定义处:

void find1(char [] array, char search, char *pa)

再看调用处:
find1(str, a, p);

仔细考虑此时形参结合所发生的事:array得到了数组名为str, search得到了a的值, pa得到了p的值(是NULL,而非p自身的地址)!但实参p并未得到形参pa传回的值(某元素的地址)。可见尽管使用了指针,也并没实现传址,当实参形参都是指针时,它们也仅仅是传值——传了别人的地址,没有传回来。


修正:

void find2(char [] array, char search, char **ppa)
{
    for (int i = 0; *(array + i) != '0'; ++i)
    {
        if (*(array + i) == search)
        {        
            *ppa = array + i;
            break;
        }
    }

    if ('\0' == *(array + i))
    {
        *ppa = NULL:
    }
}

主函数的调用处改如下:

find2(str, a, &p);    // 调用函数以实现操作

ppa是指向指针p的指针。

对*ppa的修改就是对指针p的修改。


注意: 不要将指针的用法照搬到指向指针的指针头上!

如:

char *pa 和 const char *pa是类型相容的;

但char **pa 和 const char **pa则类型不相容!

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值