📜  C++中的指针与引用

📅  最后修改于: 2021-05-26 00:36:13             🧑  作者: Mango

先决条件:指针,参考

C和C++支持与大多数其他编程语言不同的指针。其他语言包括C++, Java, Python,Ruby,Perl和PHP支持参考。

从表面上看,引用和指针非常相似,都用于使一个变量提供对另一变量的访问。两者都提供了许多相同的功能,因此通常不清楚这些不同机制之间的区别。在本文中,我将尝试说明指针和引用之间的区别。

指针:指针是一个变量,用于保存另一个变量的内存地址。需要使用*运算符将指针取消引用,以访问其指向的内存位置。

引用:引用变量是别名,即已经存在的变量的另一个名称。引用(如指针)也通过存储对象的地址来实现。
可以将引用视为具有自动间接指向的常量指针(不要与指向常量值的指针混淆!),即编译器将为您应用*运算符。

int i = 3; 

// A pointer to variable i (or stores
// address of i)
int *ptr = &i; 

// A reference (or alias) for i.
int &ref = i; 

差异

1.初始化:指针可以通过以下方式初始化:

int a = 10;        
  int *p = &a;    
         OR 
     int *p;
   p = &a;
we can declare and initialize pointer at same step or in multiple line.

2.在参考中,

int a=10;
int &p=a;  //it is correct
   but
int &p;
 p=a;    // it is incorrect as we should declare and initialize references at single step.

3.注意:编译器之间的差异可能有所不同。以上差异是针对Turbo IDE的。

4.重新分配:可以重新分配指针。此属性对于实现数据结构(例如链表,树等)很有用。请参见以下示例:

int a = 5;
int b = 6;
int *p;
p =  &a;
p = &b;

5.另一方面,引用不能重新分配,必须在初始化时分配。

int a = 5;
int b = 6;
int &p = a;
int &p = b;  //At this line it will show error as "multiple declaration is not allowed".

However it is valid statement,
int &q=p;

6.内存地址:指针在堆栈上有其自己的内存地址和大小,而引用共享相同的内存地址(与原始变量),但也占用了堆栈上的一些空间。

int &p = a;
   cout << &p << endl << &a;

7. NULL值:指针可以直接分配为NULL,而引用则不能。与引用关联的约束(无NULL,无重新分配)确保基础操作不会遇到异常情况。

8.间接:您可以使用指向提供额外级别间接的指针。而引用仅提供一种间接级别。即,

In Pointers,
int a = 10;
int *p;
int **q;  //it is valid.
p = &a;
q = &p;

Whereas in references,

int &p = a;
int &&q = p; //it is reference to reference, so it is an error.

9.算术运算:可以对指针执行各种算术运算,而没有所谓的引用算术(Reference Arithmetic)之类的东西(但是您可以获取引用指向的对象的地址,并像&obj + 5中那样对它进行指针算术)。 )

何时使用什么

性能完全相同,因为引用在内部作为指针实现。但是,您仍然可以记住一些要点,以决定何时使用什么:

  • 使用参考
    • 在函数参数和返回类型中。
  • 使用指针:
    • 如果需要使用指针算术或传递NULL指针,请使用指针。例如对于数组(请注意,数组访问是使用指针算术实现的)。
    • 由于要指向不同的单元格,因此要实现诸如链表,树等的数据结构及其算法,我们必须使用指针的概念。

C++ FAQ Lite中引用:可以使用引用,而必须使用指针。每当您不需要“重新放置”时,通常首选使用引用而不是使用指针。这通常意味着引用在类的公共接口中最有用。引用通常显示在对象的外观上,而指针则显示在对象的外观上。

上面的例外是函数的参数或返回值需要“前哨”引用,即不引用对象的引用。通常最好通过返回/获取一个指针,并赋予NULL指针特殊的意义来完成此操作(引用必须始终是别名对象,而不是取消引用的空指针)。

相关文章:
我们什么时候传递参数作为引用或指针?

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”