c语言实现cpp中的引用传递

C语言不存在按引用传递,一切都是按值传递

这是由C语言的特点决定的,C语言中不需要按引用传递,因为指针技术完全可以理所当然地实现同样的目的。

而C#和Java 这类不允许指针的语言,就必须区别这两种传递方式。

在C中,唯一容易弄混的地方是,传递的参数是数组,如下:

void fun(char *s,int a) {}

或者

void fun(char s[],int a) {}

首先,char s[]这种传参其实只是编译器为方便使用进行的特别处理,其本质仍然是 char *s.

也就是说,实际上只存在一种数组传参形式,就是char *s .

对于数组传参来说,看似是引用传递,但其实是按值传递,怎么讲呢?

调用函数传入char *s实参时,其实是对指针s 进行一次拷贝,然后将这个拷贝传递给形式参数(按值传递过程),

在被调用函数中,对数组的操作是对s 的间接操作,也就是说s 虽然本身是按值传递进来的,但s 的间接操作却起到了对 *s 的按引用传递效果。

所以,C语言没有按引用传递方式,因为也没这个必要。

虽然没研究过C#和Java的按引用传递背后的本质,不过,我猜测只是对C的这层概念的进一步封装和抽象,因为C#和Java虽然不允许指针,但其实现机制仍然是指针本身。

----补充一下,c如何实现c++中的引用效果呢?

比如说,链表操作中的插入:int Insert(ptrNode &list, int value){///};//cpp

调用:Insert(list, 1);//cpp

那么用C怎么实现呢,这里显然必须修改list,而如果list恰好是空,该如何是好?

两种方案:一是在代码里插入list是否为空的校验,问题是代码不简洁,看上去不美观;第二种我更推荐的是使用指针的指针,函数就变成了:int Insert(ptrNode *list,int value){///};//c

调用:Insert(&list,1);//c

原文地址:http://hi.baidu.com/rayord/item/5ab42844b9db82e7bdf451bb

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值