c语言中指针和引用的区别,c++语言中的引用类型与指针的不同之处

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • 详解c语言中的字符串数组是什么,详解c语言中的字符串数组结构,详解C语言中的字符串数组
  • 表达式求值c++实现,c语言实现表达式求值
  • 看懂c语言基本语法,C语言详解,C语言的基本语法详解
  • 用c语言实现快速排序算法,排序算法设计与实现快速排序C语言,C语言实现快速排序算法实例
  • 深入解析c语言中函数指针的定义与使用方法,深入解析c语言中函数指针的定义与使用情况,深入解析C语言中函数指针的定义与使用
  • 描述E-R图,E-R图举例,关于C语言中E-R图的详解
  • 折半查找法C语言,折半查找算法(算法设计题)
  • 折半查找法C语言,c语言折半法查找数据,C语言实现折半查找法(二分法)
  • 扫雷小游戏c++代码设计,c语言扫雷游戏源代码,C语言实现扫雷小游戏详细代码
  • 怎样统计程序代码行数,C语言统计行数,C#程序员统计自己的代码行数
  • 基于c语言的贪吃蛇游戏程序设计,用c语言编写贪吃蛇游戏程序,C语言实现简单的贪吃蛇游戏
  • 图的两种遍历算法,图的遍历算法代码c语言,Python算法之图的遍历
  • 留言与评论(共有 条评论)
       
    验证码: