c语言中指针和引用的区别,c++语言中的引用类型与指针的不同之处
为什么C语言中既有指针又有引用?本文基于C 03编写。它不涉及C 11中的概念,比如右值引用
引用指针和引用指针有什么区别?这是一个经常被提及的问题。也有很多博客来分析。事实上,引用是一个指针。
尽管两者的底层实现是相同的,都是基于地址的,但是,我认为这两者是完全不同的概念。
指针是一种变相的“引用”,但仍然是一种按值调用。不同的是,指针要求函数的调用方明确表示“引用”,例如,使用地址取数字符()将变量转换为指针。
引用是通过引用的调用。区别在于引用不需要由函数的调用者显式表达。根据所调用的函数,变量名可以解释为值或引用。
但是,这个博客不是用来谈论两者的区别或实现的。但是为什么C同时需要这两个看起来很像的东西。
这个问题分为两个方面:
第一,有了引用为什么还需要指针?
这相对简单,因为如果C想借用C的潜力,比雅尼斯特劳斯特鲁普必须支持指针。
第二,为什么有了指针还需要引用?
这个比较复杂。首先,一开始没有引用C。例如,这被定义为指针,而不是引用。后来,添加该引用主要是为了支持运算符重载。这在比雅尼斯特劳斯特鲁普的书《The Design and Evolution of C++》和他的C FAQ中提到过。
详细来说,假设C中没有引用,只有指针,会出现什么样的问题?
如果你用指针重载操作符,就像:
Classfooperator (constclassfoo *,constclassfoo *)只能作为一个b,和我们平时写a b的方式不太一样,显得不习惯。
可以进一步假设也可以写成a b,让编译器根据运算符的类型解释A和B的类型。如果运算符的参数是值,则解释为值;如果是指针,则解释为地址。这和现在C里把名字解释成值或者引用是一个道理。
因此,指针和值不能重载。比如下面两个函数就编译不出来。因为a和b都可以解释为值和指针。
void foo(class foo *);void foo(class foo);对于同一个函数,根据是值还是指针有不同的实现,这是比较常见的需求。而且在C语言中,指针已经有了明确的定义,不适合再赋予它其他概念。
引用概念的引入,既满足了重载运算符,又失去了重载值和指针的灵活性。虽然引用也面临一个问题,就是值和引用不能重载,但是也没必要重载。
除了支持运算符重载,reference还带来了一个指针无法替代的特性:引用临时对象。因为引用必须在定义时分配,并且以后不能更改。例如下面的代码
class class foo { public:class foo(const char *){ };};constClassFoo * g _ ClassFoo=NULLvoid foo(constClassFoo r){ };void bar(constClassFoo * p){ g _ class foo=p;};foo( ABC );bar( def );FO的调用没有问题,‘ABC’生成的临时对象只会在函数调用期间存在。
酒吧的电话有问题。指针不能指向临时对象,因为指针可以把这个关系传递出去。
综上所述,C必须同时具备指针和引用的概念。
对了,有人问了我一个很烂的问题。指针和引用哪个更好?我应该使用哪一个?
可以参考Google cstyle-guide和c -faq-lite,我就不吐槽了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。