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 数组的主要内容,如果未能解决你的问题,请参考以下文章

Java中如何调用枚举类中的数组

精选力扣500题 第73题 LeetCode 153. 寻找旋转排序数组中的最小值c++/java详细题解

Java中怎么对数组中的字符串进行排序

JAVA用迭代的思想,不遍历,找出数组中的最大值

java数组小结

怎样将一个数组逆序输出?