函数执行过程
1.通过函数名字找到函数入口;
2.给形参分配空间;
3.传值;
4.执行函数体语句;
5.返回,释放空间。
函数传参时什么时候传地址,什么时候传值?
1.当只使用不修改实参变量对应空间的值,传实参变量名;
2.当使用并修改实参变量对应空间的值,传实参变量的地址。
举个例子:
#include <stdio.h>
void func(char *ptr)
{
ptr++;
}
int main(int argc,char **argv)
{
char *src = "hello world";
func(src);
printf("src = %s\n",src);
}
读者认为输出的结果是什么?
输出结果为:hello world
函数的本来意图是让字符串从e往后开始输出,即输出ello world,可函数并没有实现,为什么?
让我来为大家解读下这个程序,首先定义一个指针变量src,保存的是字符串首字符的地址,假设地址为0x1000,然后调用函数func,函数执行时通过函数名找到函数的入口,然后给形参ptr分配空间,里面保存的是主函数传过来的0x1000,之后执行函数体ptr++,ptr对应空间的值做自加,ptr变为0x1001,函数执行完释放空间。整个过程发现,只是形参做了自加,并未改变实参的值。
那么要想实现输出ello world,源代码该如何做修改?
要想改变实参的值,我上面说了传参时就必须传实参的地址。所以改为:
#include <stdio.h>
void func(char **ptr)
{
(*ptr)++;
}
int main(int argc,char **argv)
{
char *src = "hello world";
func(&src);
printf("src = %s\n",src);
}