有一天我学习Java而我在C中有一些知识。现在我正在尝试将用C编写的代码转换为Java代码。在那里,我找到了一个指向指针(pptr
)变量声明的指针 -
int n;
int *ptr;
int **pptr;
n = 13;
ptr = &n;
pptr = &ptr;
据我所知,在Java中没有指针类型变量。我的问题是,有没有办法在Java中表示pptr
或等同于pptr
的任何内容?
答案 0 :(得分:4)
让我们看一下C中多个间接的一些用例,看看它们如何应用于Java。
用例#1 :您希望函数或方法更改指针或引用参数的值,使其指向新对象,并在调用者中反映该更改。
在C中,看起来像这样:
void foo( T **p )
{
*p = new_value(); // update the thing p points to
}
void bar( void )
{
T *var; // for any type T
foo( &var ); // foo will set var to point somewhere else
}
var
是指向某个内容的指针,我们希望函数foo
更改var
,使其指向其他内容。由于C按值传递所有函数参数,如果我们希望foo
更新var
,我们必须将指针传递给var
,在foo
中给我们指向指针类型的指针。
Java没有公开指针类型的操作(没有一元&
地址或*
间接运算符),所以我们不能直接这样做。我们必须在另一个引用类型中包装我们想要更改的引用,并将该包装类型传递给方法,即使这样我也不确定它会做同样的事情作为上面的C代码:
public class thing
{
// attributes
}
public class thingWrapper {
{
public thing t;
}
public void pointToNewThing( thingWrapper tw )
{
tw.t = newThing();
}
public void bar()
{
thing t = new thing();
...
thingWrapper tw = new thingWrapper();
tw.t = t;
pointToNewThing( tw );
t = tw.t;
...
}
用例#2 :您希望以零散的方式分配多维数组,而不是单个操作。如果你想要一个"锯齿状的"数组(每行中的元素数量不均匀)或者您是否尝试分配大量内存并且没有一个可用的大块足以满足整个事情。
在C中,您可以执行类似
的操作T **arr = malloc( N * sizeof *arr );
if ( arr )
{
for ( int i = 0; i < N; i++ )
{
arr[i] = malloc( M * sizeof *arr[i] );
}
}
因为C数组不是&#34;第一类&#34;对象,并且无法直接操作和分配,因此 通过指针执行此操作。
Java完全不同地对待数组,这样你根本不需要做指针到指针的舞蹈:
T arr[][] = new arr[N];
for ( i = 0; i < N; i++ )
{
arr[i] = new arr[M];
}
我无法想到其他用例,但这应该会让您了解如何将C概念转换为Java。
答案 1 :(得分:2)
简短的回答是肯定的。但首先,Java课程......
在Java中,无论何时使用对象,都会涉及到指针。如果你有一个对象,那个“拥有”该对象的变量实际上是指向该对象的指针。因此,如果您正在使用对象,那么您已经在使用指针。
现在,对于原始数据类型(例如,整数,字符或浮点数),Java不使用指针。因此,如果您需要原始数据类型的指针,则需要使用wrapper class,例如Integer
,它可以有效地提升对象的值。
但请注意,默认的包装类是不可变的。
如果你想要双指针(一个指针指针)或三指针,你需要创建自定义包装类,如ObjectWrapper
类,允许你设置任意数量的对象指向(或“持有”)下一个。
答案 2 :(得分:1)
你可以做的就是创建一个int数组,即使大小为1,当你访问数组时,就编程而言,它总是引用内存中的相同位置。