实例:设计一个函数:void find1(char array[], char search, char *pa)
要求:这个函数参数中的数组array是以0值为结束的字符串,要求在字符串array中查找字符是参数search 里的字符。如果找到,函数通过第三个参数pa返回值为array 字符串中第一个找到的字符的地址。如果没找到,则为pa为0。
- #include<stdio.h>
- void find1(char array[], char search, char *pa)
- {
- int i;
- for (i = 0; *(array + i) != 0; i++)
- {
- if ( *(array+i) == search)
- {
- pa = array + i;
- break;
- }
- else if (*(array+i) == 0)
- {
- pa = 0;
- break;
- }
- }
- }
-
- main()
- {
- char str[] = {"afsdfsdfdf\0"}; /* 待查找的字符串 */
- char a = 'd'; /* 设置要查找的字符 */
- char *p = 0; /* 如果查找到后指针 p 将指向字符串中查找到的第1个字符的地址。 */
- find1(str, a, p); /* 调用函数以实现所要操作。 */
- if (0 == p)
- {
- printf("没找到!\n"); /* 如果没找到则输出此句 */
- } else
- {
- printf("找到了,p = %d\n", p); /* 如果找到则输出此句 */
- }
- return(0);
- }
唉!怎么输出的是:没有找到!而不是“找到了,……”。明明a值为'd',而 str字符串的第四个字符是'd’,应该找得到呀!
原因解释:函数调用时会对每一个参数进行一个隐含的赋值操作。整个调用如下:
array = str;
search = a;
pa = p; /* 请注意:以上三句是调用时隐含的动作。*/
明白了:哦!参数pa与参数search 的传递并没有什么不同,都是值传递嘛(小语:地址传递其实就是地址值传递嘛)!所以对形参变量pa值(当然值是一个地址值)的修改并不会改变实参变量p值,因此p的值并没有改变 (即p的指向并没有被改变)。
改正代码(绿色字体处)后,完整代码如下:
- #include<stdio.h>
- void find1(char array[], char search, char **ppa)
- {
- int i;
- for (i = 0; *(array + i) != 0; i++)
- {
- if ( *(array+i) == search)
- {
- *ppa = array + i;
- break;
- }
- else if (*(array+i) == 0)
- {
- *ppa = 0;
- break;
- }
- }
- }
-
- main()
- {
- char str[] = {"afsdfsdfdf\0"}; /* 待查找的字符串 */
- char a = 'd'; /* 设置要查找的字符 */
- char *p = 0; /* 如果查找到后指针 p 将指向字符串中查找到的第1个字符的地址。 */
- find1(str, a, &p); /* 调用函数以实现所要操作。 */
- if (0 == p)
- {
- printf("没找到!\n"); /* 如果没找到则输出此句 */
- } else
- {
- printf("找到了,p = %d\n", p); /* 如果找到则输出此句 */
- }
- return(0);
- }
运行结果如下:
哦
这里ppa指向指针p的地址,对*ppa的修改就是对p值的修改。
阅读(3077) | 评论(0) | 转发(8) |