设计一个函数:
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则类型不相容!