最近在论坛上看到有一篇帖子提问下面的问题:
char * fun(char *p)
{
return p;
}
提问:此函数返回的是谁的值,是参数p的地址,还是p的值?
回答:
p的值,但其值指向一个内存地址
p是栈中的地址,和局部变量的地址一样,函数返回后这块内存就无效了。
这种用法还是很常见的,比如链表中。
虽然p是栈中的地址,但是因为它只是指针副本,所以可以改变指针的指向(通过return的返回值),指向其他地方。
记得在学习C语言函数那部分的时候,有一个很重要的概念是区别:值传递、指针传递、引用传递(好像是这三种说法)。
我觉得要理解这部分知识点,首先应该知道不同种类的变量在内存中是如何分配存储的,它们的生命周期多长等这些问题,然后再看上面的三种情况就好理解了。函数的参数都是在stack栈上分配的,所以它们的生命周期就在它们所属的函数内,函数执行完毕的时候,它们所占的内存将被回收。
如果我们想在函数内对实参进行操作(不是对实参的副本,形参)的话,一般会使用引用,即声明函数的形参为引用类型,比如char * fun(char * &p),这样实参和形参为同一个变量,我们在函数中操作形参p就等于直接在操作实参变量。在看C++语法书的时候,书上说这样用还有一个好处是,在调用函数的时候,不用再为形参分配内存了,所以这样执行效率会高一点儿。
下面是函数形参为指针的几种情况:
下面再看一个在实际应用中经常会出错的一个例子(检测一下我们是否理解了上面的概念):
下面是某company对此知识点出的考题: