二级指针
2015-10-09 11:07
190 查看
为什么使用二级指针
分类: C/C++2012-03-3021: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;
}
相关文章推荐
- SetWindowPos && FindWindowA
- swift 自定义TabBarItem
- MongoDB(二)
- python3爬虫之入门基础和正则表达式
- DLL库的Def
- Xcode Build Search Paths设置
- 教你用PS给你的室友做一套动态微信豪华表情包
- GTK+浅谈之十二数据库编程
- raw socket
- Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
- 训练自己haar-like特征分类器并识别物体(2)
- 设计模式之原型模式
- grails之二级联动后的文本框内容的切换
- beecloud resrful api test(nodejs)
- abort 用法讨论
- Sharepoint增加修改密码功能
- ref - 按引用传递参数
- [转] Linux下查看文件和文件夹大小
- 代码开发规范
- 【c++】vector用法