您的位置:首页 > 其它

二级指针

2015-10-09 11:07 190 查看


为什么使用二级指针

分类: C/C++2012-03-30
21:48 2902人阅读 评论(0) 收藏 举报

searchnull

设计一个函数:

[cpp] view
plaincopy

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

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

依题意,实现代码如下。

[cpp] view
plaincopy

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;

}

}

}

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

下面调用这个函数试试

[cpp] view
plaincopy

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?!

分析: 先看函数定义处:

[cpp] view
plaincopy

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

再看调用处:

[cpp] view
plaincopy

find1(str, a, p);

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

修正:

[cpp] view
plaincopy

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:

}

}

主函数的调用处改如下:

[cpp] view
plaincopy

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

ppa是指向指针p的指针。

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

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

如:

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

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

以上代码有误,更新后的,此是可以编译通过的:

#include <stdio.h>

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

{

int i = 0;

for (i = 0; *(array + i) != '\0'; ++i)

{

if (*(array + i) == search)

{

pa = array + i; // pa得到某元素的地址

break;

}

}

}

void find2(char array[], char search, char **ppa)

{

int i = 0;

for (i = 0; *(array + i) != '0'; ++i)

{

if (*(array + i) == search)

{

*ppa = array + i;

break;

}

}

if ('\0' == *(array + i))

{

*ppa = NULL;

}

}

int main(int argc, char *argv[])

{

char str[] = "abcdefdfefde"; // 待查找的字符串

char a = 'd'; // 设置要查找的字符

char *p = NULL; // 先置为空

//find1(str, a, p); // 调用函数以实现查找操作

find2(str, a, &p);

if (NULL == p)

{

printf("Not found!\r\n");

}

else

{

printf("found it!\r\n");

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: