现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

为什么使用二级指针

2018-11-03 14:45 工业·编程 ⁄ 共 1307字 ⁄ 字号 暂无评论

设计一个函数:

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则类型不相容!

给我留言

留言无头像?