指针出参探究

最近在写一段函数的时候发现了一个关于指针出参的问题,当时情况是这样的,我打算将形参声明为char型指针,在被调用函数中为该指针分配空间。由于设计的需要,并不会将地址作为返回值,而是需要通过出参来达到取得地址的效果。
示例代码如下:
int getPoint(char *src)
{
    src=(char *)malloc(100);
    if(NULL == src)
        return -1;
    return 0;
}
int main(void)
{
    char *point = NULL;
    getPoint(point);
    if(NULL == point)
        printf("the point is NULL\n");
    if(NULL != point)
    printf("the point is not NULL\n");
}
编译上述代码,执行二进制文件,执行结果为输出 the point is NULL。
这是因为在函数被调用的过程中,一般来讲我们分为传值和传址两种参数传递行为。在一般的传址行为中,我们需要对指定的地址上的数据进行修改,本质上传址行为也是传值行为,这不过传递的是地址的拷贝,按照地址的拷贝去修改制定内存上的值,这样在使用该源地址去取值的时候,会得到修改后的值。传值行为就不介绍了。
在需要指针出参的函数调用中,虽然我们传递的是地址,但是需要注意,我们将要修改的值恰恰正是这个地址,因为在被调用函数中为指针参数分配空间会修改其指向的内存,即修改该指针的值。这与普通意义上的传值行为是一样的,传递进去的只是该指针值的一个拷贝,单单修改这个拷贝,除非将返回值修改为该指针,否则是不能修改原指针上保存的值,所以此处我们需要传递给被调用函数的是该指针的地址,即更深一层的传址操作(指针的地址,修改指针上的值,而不是修改指针指向的内存上值)。


指针出参需要将指针的地址传递进去,这样才能达到修改该指针保存的值的效果。其实想通了就明白了,这也是因为传值与传址的差别了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值