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严格按值传递