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

📅  最后修改于: 2022-05-13 01:55:02.230000             🧑  作者: Mango

C/C++ 指针与Java引用

Java没有指针; Java有参考。
引用:引用是引用其他事物的变量,可以用作其他事物的别名。
指针:指针是存储内存地址的变量,目的是充当存储在该地址的内容的别名。
所以,指针是引用,但引用不一定是指针。指针是引用概念的一种特殊实现,并且该术语往往仅用于使您可以直接访问内存地址的语言。

让我们讨论一些关于 C/C++ 和Java上下文中的指针和引用的关键点:

  • C/C++ 允许指针算术,但Java指针(引用)不允许:术语“指针”与 C/C++ 指针的概念密切相关,指针是存储内存地址的变量,可以通过算术修改以指向任意地址。
    在Java中,指针仅作为引用的实现细节存在。引用的副本被复制到被调用函数的堆栈中,指向与调用函数相同的对象,并允许您操作该对象。但是,您不能更改调用函数引用的对象。
  • Java不显式支持指针,但Java隐式使用指针: Java使用指针来操作引用,但这些指针不可用于外部使用。语言隐式执行的任何操作实际上都是不可见的。
  • 指针可以做算术,引用不能:通过指针算术访问内存从根本上是不安全的,为了安全起见, Java有一个强大的安全模型,因此不允许指针算术。无论情况如何,用户都无法操纵指针。
  • 指向对象:在 C 语言中,我们可以通过添加或减去指针的地址来指向事物。在Java中,一个引用只指向一件事。你可以让一个变量持有不同的引用,但是这种对指针的 c 操作是不可能的。
  • 引用是强类型的: Java中的引用类型比 C 中的指针类型受到更严格的控制。在 C 中,您可以拥有一个 int* 并将其转换为 char* 并重新解释内存地点。这种重新解释在Java中不起作用:您只能将引用另一端的对象解释为它已经存在的东西(即,只有当指向的对象实际上是一个对象时,您才能将 Object 引用转换为 String 引用细绳)。
  • 指针的操作可能很危险:一方面,用户控制指针可能是好的和灵活的,但它也可能被证明是危险的。它们可能会成为问题的重要来源,因为如果使用不当,它们很容易破坏您的代码是围绕构建的假设。而且很容易错误地使用它们。

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

说明指针操作的 CPP 程序

// A simple CPP program to illustrate 
// the concept of pointers and 
// their manipulations in C/C++
#include 
using namespace std;
   
int main()
{
   int number = 88;    
   int * pNumber;  
     
   // assign the address of the variable number 
   // to pointer pNumber
   pNumber = &number;  
   
   // Print content of pNumber 
   cout << pNumber << endl;  
     
   // Print address of number
   cout << &number << endl;  
     
   // Print value pointed to by pNumber
   cout << *pNumber << endl; 
     
   // Print value of number
   cout << number << endl;   
   
   // Re-assign value pointed to by 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程序

// A simple Java program 
// to illustrate the concept of 
// references 
class Rectangle 
{
  double length;
  double breadth;
}
  
class RectangleDemo
{
    public static void main(String args[])
    {
      
    // r1 is reference variable which contain 
    // the address of Actual Rectangle Object.
    Rectangle r1 = new Rectangle();
        
    // r2 is another reference variable
    // r2 is initialized with r1 means:
    // r1 and r2 both are referring same object 
    // thus it does not create duplicate object 
    // nor does it allocate extra memory.
    Rectangle r2 = r1;
      
    r1.length = 10;
    r2.length = 20;
      
    System.out.println("Value of R1's Length : " + r1.length);
    System.out.println("Value of R2's Length : " + r2.length);
  
    }
}

输出:

Value of R1's Length : 20.0
Value of R2's Length : 20.0

相关文章:

  • C/C++ 指针
  • Java严格按值传递