最后一天,我在学习 Java 的同时我还掌握了一些 C 知识。现在我正在尝试将用 C 编写的代码转换为 Java 代码。在那里我找到了一个指向指针 ( pptr) 变量声明的指针,如下所示 -
int n;
int *ptr;
int **pptr;
n = 13;
ptr = &n;
pptr = &ptr;
Run Code Online (Sandbox Code Playgroud)
据我所知,Java 中没有指针类型变量。我的问题是有什么方法可以在 Java 中表示pptr或等效pptr?
让我们看看 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
}
Run Code Online (Sandbox Code Playgroud)
var是一个指向某物的指针,我们希望该函数foo发生变化var,使其指向其他某物。由于 C 按值传递所有函数参数,如果我们想要foo更新var,我们必须传递一个指向 的指针var,给我们一个指向指针类型 in 的指针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;
...
}
Run Code Online (Sandbox Code Playgroud)
用例 #2:您希望以零散的方式分配多维数组,而不是在单个操作中。如果您想要一个“锯齿状”数组(其中每行中的元素数量不统一),或者如果您尝试分配大量内存并且没有足够大的单个可用块,这将很有用整件事。
在 C 中,你会做类似的事情
T **arr = malloc( N * sizeof *arr );
if ( arr )
{
for ( int i = 0; i < N; i++ )
{
arr[i] = malloc( M * sizeof *arr[i] );
}
}
Run Code Online (Sandbox Code Playgroud)
因为 C 数组不是“第一类”对象,不能直接操作和赋值,所以必须通过指针来实现。
Java 以完全不同的方式对待数组,因此您根本不需要进行指针对指针的跳转:
T arr[][] = new arr[N];
for ( i = 0; i < N; i++ )
{
arr[i] = new arr[M];
}
Run Code Online (Sandbox Code Playgroud)
我想不出其他用例,但这应该让您了解如何将 C 概念转换为 Java。
| 归档时间: |
|
| 查看次数: |
4656 次 |
| 最近记录: |