指针作为函数形参的思考

最近在论坛上看到有一篇帖子提问下面的问题: 

char * fun(char *p)
{
      return p;
}
提问:此函数返回的是谁的值,是参数p的地址,还是p的值? 

回答:



p的值,但其值指向一个内存地址

p是栈中的地址,和局部变量的地址一样,函数返回后这块内存就无效了。

这种用法还是很常见的,比如链表中。

虽然p是栈中的地址,但是因为它只是指针副本,所以可以改变指针的指向(通过return的返回值),指向其他地方。



记得在学习C语言函数那部分的时候,有一个很重要的概念是区别:值传递、指针传递、引用传递(好像是这三种说法)。

我觉得要理解这部分知识点,首先应该知道不同种类的变量在内存中是如何分配存储的,它们的生命周期多长等这些问题,然后再看上面的三种情况就好理解了。函数的参数都是在stack栈上分配的,所以它们的生命周期就在它们所属的函数内,函数执行完毕的时候,它们所占的内存将被回收。

如果我们想在函数内对实参进行操作(不是对实参的副本,形参)的话,一般会使用引用,即声明函数的形参为引用类型,比如char * fun(char * &p),这样实参和形参为同一个变量,我们在函数中操作形参p就等于直接在操作实参变量。在看C++语法书的时候,书上说这样用还有一个好处是,在调用函数的时候,不用再为形参分配内存了,所以这样执行效率会高一点儿。

 

下面是函数形参为指针的几种情况:

下面再看一个在实际应用中经常会出错的一个例子(检测一下我们是否理解了上面的概念):

下面是某company对此知识点出的考题:


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值