关于c函数中指针参数的疑惑

zfq642773391 2010-11-21 09:38:23

#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;
}
}

}
void main(){
char str[]={"afsdfsdfdf\0"};
char a='s';
char *p=0;
find1(str,a,&p);
if(0==p){
printf("not found!\n");

}else{
printf("found!\n");
}
}

这个程序的功能是在一个字符串中查找是否含有一个字符,在find1函数中,参数pa无论是char*类型还是char**类型,都能正确运行,如果是char*我可以理解,指针嘛,指向一个char的内容,*pa是他的内容,*pa=array+i,赋值成功;但如果是char**类型,那*pa就是就是一个指针本身的值了,*pa=array+i,这样赋值应该不对吧!但是还是运行成功,求解释

另外有个疑惑,假如有个函数

void mcpy(const char *ptr);
int test(const char *ptr){
mcpy(ptr);
}

在test内调用mcpy时,参数应该是&ptr还是ptr呢,按我的理解,mcpy要求一个指针参数,所以应该传入&ptr,但我见到的例子确实mcpy(ptr),而不是mcpy(&ptr);不懂,求谁帮忙解释下
...全文
271 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
MSOKD 2010-11-22
  • 打赏
  • 举报
回复
我也帮你测试了一下当是 char **p=0;时出错的.
zfq642773391 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 bobo364 的回复:]
其实这个问题的需求,貌似没必要声明指向指针的指针。参考如下代码


C/C++ code
#include <stdio.h>

void find1(char array[],char search,char * pa)
{
int i;
for (i=0;*(array+i)!=0;i++)
{
if(*(array+i)==search)
……
[/Quote]
这个有问题吧
p是指针,那&p就是指向指针的指针,
find1(str,a,&p);
中第三个参数是char**,与定义的char*不符啊
bobo364 2010-11-22
  • 打赏
  • 举报
回复
其实这个问题的需求,貌似没必要声明指向指针的指针。参考如下代码

#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;
}
}

}

int main()
{
char str[]={"afsdfsdfdf\0"};
char a='a';
char *p=0;
find1(str,a,&p);
if(0==p)
{
printf("not found!\n");
}
else
{
printf("found!\n");
}
system("pause");
return 0;
}
bobo364 2010-11-22
  • 打赏
  • 举报
回复
*pa=array+i这样的写法正确,你声明的char **pa,指向指针的指针
#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;
}
}

}

int main()
{
char str[]={"afsdfsdfdf\0"};
char a='s';
char *p=0;
find1(str,a,&p);
if(0==p)
{
printf("not found!\n");
}
else
{
printf("found!\n");
}
system("pause");
return 0;
}

AnYidan 2010-11-22
  • 打赏
  • 举报
回复
array[] 数组名就是指针,指向数组的首地址
赵4老师 2010-11-22
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
dream17953 2010-11-22
  • 打赏
  • 举报
回复
我来打酱油的
zfq642773391 2010-11-22
  • 打赏
  • 举报
回复
我有些明白了,**用的场合还真奇妙
screwzm 2010-11-22
  • 打赏
  • 举报
回复
1 、楼主第一个函数没返回值,所以用指针(char *)和指针的指针(char **)区别不大,但是有返回值的时候就不一样了,要改变指针的值(注意,不是指针指向的值)就必须用指针的指针才能完成!(值传递过程)
2、第二个例子当然是用* ptr了,因为形参给的就是指针的,没必要用&ptr,这样就变成指针的指针了!
list-man 2010-11-22
  • 打赏
  • 举报
回复
假设pa的地址是0x0001,pa指向0x0008(pa的内容)
参数是char *pa的话 *pa = *(array+1);是改变pa指向的内存的值,而不是改变了pa的指向。
参数是char **pa的话*pa = *(array+1);是改变pa的指向,也就是改变了pa的内容,而不是改变了pa原来指向的地址的值
Metrosexual 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wweixinkuang 的回复:]
肯定是ptr啊!&ptr是指针的地址。指针参数传递的是指针,不是指针的地址。
[/Quote]
+1
pang123hui 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wweixinkuang 的回复:]

肯定是ptr啊!&ptr是指针的地址。指针参数传递的是指针,不是指针的地址。
[/Quote]

是的,ptr就是指针了,再取地址,就是指针的指针的,当行参是**ptr这种指针的指针时,才需要&ptr
Athenacle_ 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wweixinkuang 的回复:]

肯定是ptr啊!&ptr是指针的地址。指针参数传递的是指针,不是指针的地址。
[/Quote]
就是这样 ~。。
wweixinkuang 2010-11-21
  • 打赏
  • 举报
回复
肯定是ptr啊!&ptr是指针的地址。指针参数传递的是指针,不是指针的地址。
zfq642773391 2010-11-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 athenacle_ 的回复:]
LZ在Java区有3000+的技术分,怎么连这点都想不通~。。虽说Java没指针把。。可。。。。
[/Quote]
指针这块真的是好难弄啊!
Athenacle_ 2010-11-21
  • 打赏
  • 举报
回复
LZ在Java区有3000+的技术分,怎么连这点都想不通~。。虽说Java没指针把。。可。。。。
Athenacle_ 2010-11-21
  • 打赏
  • 举报
回复
第一个问题,如果find1形参是char*的话, find1(str,a,&p);这句调用就是错的~p已经是指针了,&p就是指针的指针。。。
如果 void find1(char array[],char search,char ** pa)的话 应该find1(str,a,&p);

如果 void find1(char array[],char search,char * pa)的话 应该find1(str,a,p);

结果一样的话,大概是LZ的编译器出问题了~~

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧