📜  C/C++指针与Java引用

📅  最后修改于: 2020-03-30 03:25:59             🧑  作者: Mango

Java没有指针, 但Java有引用。
引用:引用是引用其他内容的变量,可以用作其他内容的别名。
指针:指针是存储内存地址的变量,目的是充当该地址所存储内容的别名。
因此,指针是引用,但引用不一定是指针。指针是引用概念的特定实现,该术语用于允许您直接访问内存地址。
让我们讨论有关C/C++和Java上下文中的指针和引用的一些要点:

  • C/C++允许使用指针算术,但Java引用不允许:术语“指针”与C/C++指针概念紧密相关,指针是存储内存地址的变量,可以进行算术修改以指向任意地址。在Java中,指针仅作为引用References的实现细节存在。引用的副本将复制到被调用函数的堆栈中,指向与调用函数相同的对象,并允许您操作该对象。但是,您不能更改调用函数所引用的对象。
  • Java不明确支持指针,但是Java隐式使用了指针:Java使用指针来操纵引用,但是这些指针不可用于外部使用。该语言隐式完成的任何操作实际上都不可见。
  • 指针可以做算术,引用不能:指针算术进行的内存访问从根本上说是不安全的,并且为了安全起见,Java具有健壮的安全性模型,并且出于这个原因不允许使用指针算术。无论什么情况,用户都无法操纵指针。
  • 指向对象:在C语言中,我们可以添加或减去指向事物的指针地址。在Java中,引用指向一个对象。您可以使变量保留不同的引用,但是无法对指针进行此类C操作。
  • 引用是强类型的: 与C中的指针类型相比,Java中对引用的类型进行严格控制。在C中,您可以具有int *并将其转换为char *,然后重新解释该位置的内存。位置这种重新解释在Java中不起作用:您只能将引用另一端的对象解释为已经存在的某种东西(即,仅当指向的对象实际上是一个对象时,才可以将Object引用转换为String引用)。串)。
  • 指针的操作可能很危险:   一方面,由用户控制指针可能既好又灵活,但事实也很危险。事实证明,它们可能是造成问题的重要原因,因为如果使用不当,它们很容易破坏代码建立的假设。错误地使用它们却很容易。

因此,整个Java没有指针(在C/C++意义上),因为对于通用OOP编程它不需要它们。此外,添加指向Java的指针将破坏安全性和健壮性,并使该语言更加复杂。

// C++代码展示指针和对应的操作
#include 
using namespace std;
int main()
{
   int number = 88;
   int * pNumber;
   // 赋值地址给指针
   pNumber = &number;
   // 打印pNumber
   cout << pNumber << endl;
   // 打印地址
   cout << &number << endl;
   // 打印被pNumber指向的值
   cout << *pNumber << endl;
   // 打印value
   cout << number << endl;
   // 重新分配pNumber
   *pNumber = 99;
   cout << pNumber << endl;
   cout << &number << endl;
   cout << *pNumber << endl;
   cout << number << endl;
   cout << &pNumber << endl;
}

输出:

0x7fff1ae7ca94
0x7fff1ae7ca94
88
88
0x7fff1ae7ca94
0x7fff1ae7ca94
99
99
0x7fff1ae7ca98

Java程序说明参考

// Java程序,展示引用的概念和使用
class Rectangle
{
  double length;
  double breadth;
}
class RectangleDemo
{
    public static void main(String args[])
    {
    // r1是包含Rectangle对象的引用
    Rectangle r1 = new Rectangle();

    // r2是另一个引用变量, r1和r2指向同一个对象
    Rectangle r2 = r1;
    r1.length = 10;
    r2.length = 20;
    System.out.println("R1长度: " + r1.length);
    System.out.println("R2长度: " + r2.length);
    }
}

输出:

R1长度 : 20.0
R2长度 : 20.0