我们一般都说c语言中函数调用有两种调用方式,严格来讲这其实是不对的。。严格来讲,c中就只有一种传递方式,那就是值传递。。。!!!!
看下面程序
#include<stdio.h>
void increment_1(char *p)
{
++p;
printf("In increment_1 %s/n",p);
}
void increment_2(char **p)
{
++(*p);
printf("In increment_2 %s/n",*p);
}
int main()
{
char *s="I love you!";
increment_1(s);
printf("%s/n",s);
increment_2(&s);
printf("%s/n",s);
}
运行一下你会发现,increment_1将s指针的值+1,而是要用第二中方式才能实现,因为是值传递!!!
increment_1中的*p=*s,并且在increment中输出p也得到了想要的结果,但是p和s是不同的!!!,p的改变并没有影响到s!!!而increment_2接受的是s的地址,所以p中存的是s的地址,通过increment_2中的++(*p),将*p,即s的值得加了1,这样才实现了s的改变!!!
总结:要想改变一个参数的值,你必须传递个函数参数的地址,不管则个参数是arg,还是*arg,甚至是**arg!!!
看下面程序
#include<stdio.h>
void increment_1(char *p)
{
++p;
printf("In increment_1 %s/n",p);
}
void increment_2(char **p)
{
++(*p);
printf("In increment_2 %s/n",*p);
}
int main()
{
char *s="I love you!";
increment_1(s);
printf("%s/n",s);
increment_2(&s);
printf("%s/n",s);
}
运行一下你会发现,increment_1将s指针的值+1,而是要用第二中方式才能实现,因为是值传递!!!
increment_1中的*p=*s,并且在increment中输出p也得到了想要的结果,但是p和s是不同的!!!,p的改变并没有影响到s!!!而increment_2接受的是s的地址,所以p中存的是s的地址,通过increment_2中的++(*p),将*p,即s的值得加了1,这样才实现了s的改变!!!
总结:要想改变一个参数的值,你必须传递个函数参数的地址,不管则个参数是arg,还是*arg,甚至是**arg!!!