函数的执行过程

函数执行过程

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值