C++中指针与引用的关系

先决条件: 指针 , 工具书类

null

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   butint &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,而引用不能。与引用关联的约束(无空、无重新分配)确保底层操作不会遇到异常情况。

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.算术运算: 各种算术运算可以在指针上执行,而没有所谓的参考算术。(但您可以获取引用指向的对象的地址,并对其进行指针运算,如&obj+5所示。)

什么时候用什么

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

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

在C++ FAQ Lite中引用 :尽可能使用引用,必要时使用指针。当你不需要“重置”时,引用通常比指针更受欢迎。这通常意味着引用在类的公共接口中最有用。引用通常出现在对象的外观上,指针出现在内部。

上述情况的例外情况是,函数的参数或返回值需要“sentinel”引用,即不引用对象的引用。这通常最好通过返回/获取指针,并赋予空指针特殊意义(引用必须始终别名对象,而不是取消引用的空指针)来实现。

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

本文由 里沙夫·拉杰 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以使用 贡献极客。组织 或者把你的文章寄到contribute@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。

如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享