C 代码中的 Java 数组
Posted
技术标签:
【中文标题】C 代码中的 Java 数组【英文标题】:Java arrays in C code 【发布时间】:2017-09-25 14:34:44 【问题描述】:我正在学习 Java 数组,并且来自 C/C++ 背景,我试图围绕 Java 中数组的整个概念展开思考。 由于 Java 中的所有内容都是指针,因此我理解甚至数组也是指向对象(在本例中为数组对象)的指针,并且这些数组对象包含原始类型值(int[] ia)或指向对象的指针(String[] sa ),因为我们不能像在 C++ 中那样操作对象,而只能引用堆上的对象。 那么像这样在 C 代码中表示二维 Java 数组是否正确:
TYPE *(*(*aptr)[M])[N];
(*aptr) has type: TYPE *(*[M])[N] and is converted to: TYPE *(**)[N]
(*aptr)[m] has type: TYPE *(*)[N]
*(aptr)[m] has type: TYPE *[N] and is converted to: TYPE **
(*(*aptr)[m])[n] has type: TYPE *
so
TYPE obj = *(*(*aptr)[m])[n]) has type TYPE
我做对了吗?
【问题讨论】:
向谁提出了问题:我在问我的推理是否正确,如果不是,请提供正确的答案。 如果你在处理Java,你最好忘记指针。至少一开始。 @EugeneSh。是的,但是由于 Java 引用本质上是指针,我发现尝试在 C 代码中表示 Java 数组非常有启发性(仅用于学习目的) 我不明白你在问什么。那个代码是什么(甚至是代码)? @FrankUnderwood 确实它不是代码(我们可以尝试将它提交给编译器:D)我问在 C 代码中表示 Java 数组是否正确,就像我在问题中所做的那样 【参考方案1】:你错过了两点。 Java 数组知道它的类型和长度,因此它的 C 等价物将是一个结构。 Java int[] 数组的一个粗略类比是(这种解释并不意味着任何现有的 JVM 都使用这种结构,它只是作为 Java 数组的 C 语言类比):
struct int_array
TYPE *type; // This points to a description that we are an int[] array
int length;
int *data; // Allocated with malloc(length*sizeof(int))
;
如果i
位于0...length-1
之外,则Java a[i]
然后转换为C a->data[i]
加上ArrayIndexOutOfBoundsException
。
二维数组只是数组的数组,例如int[][] 可能看起来像:
struct two_dim_int_array
TYPE *type; // This points to a description that we are an int[][] array
int length;
struct int_array *data; // Allocated with malloc(length*sizeof(struct int_array))
;
因此,b[i][j]
转换为 b->data[i].data[j]
,并带有必要的范围和空值检查。
【讨论】:
仅供参考,在 C++ 中有std::vector
,这是等价的。
我的 C/C++ 知识相当生疏(ANSI C 或多或少停止了),因为当 Java 在 90 年代后期开始流行时,我转向了它。但无论如何,我认为对于这种低层次的解释,普通的老 C 给出了最清晰的观点。以上是关于C 代码中的 Java 数组的主要内容,如果未能解决你的问题,请参考以下文章