【问题标题】:What does const char*** mean and how does it translate from C to Java?const char*** 是什么意思,它是如何从 C 转换为 Java 的?
【发布时间】:2015-03-04 13:24:03
【问题描述】:

我正在使用 JNAC++ 编写的 DLL 编写 Java 接口,用于控制小型设备。

在翻译我遇到的数据类型时

const char*** someVariable

谁能向我解释一下这是什么意思以及如何在 Java 中重新创建它?

我已经阅读了指针,我正在使用 JNA 文档将 C++ 类型映射到 Java,但我找不到对末尾带有三个星号的类型的引用。

是否应该将其解释为指向字符串数组的指针?

【问题讨论】:

  • 它是一个指向一个指向const char的指针的指针。不幸的是,它可以有多种解释。
  • 我会看成一个二维的 c 风格字符串数组。
  • 您可能刚刚看过three star programmer 的作品。它可能是一个字符串列表的列表。
  • 这意味着无需费心去正确抽象数据类型。您必须阅读文档(或使用它的代码)才能弄清楚为什么会有如此多的间接性。
  • 在 java 中最接近的就是静态 [][] char variableName;

标签: java c++ c jna


【解决方案1】:

如果你知道指针的概念,

const char*** 表示它是一个三元指针,所以你可以这样想:

const char***--->const char**--->const char*--->const char

所以是的,它可以解释为指向字符串数组的指针,因为字符串数组可以解释为双指针。

假设a 是一个字符串数组:

const char *a[15];

在这种情况下,**a 会为您提供 a 中第一个字符串的第一个字符。

你可以声明:

const char ***b = &a;

在这种情况下,***b 将为您提供 a 中第一个字符串的第一个字符。

【讨论】:

  • 但是字符串数组不是双指针。它是一个字符串数组。
  • 你可以把它解释成双指针,也可以把双指针当作字符串数组,这取决于你想怎么编程。
  • 是的,它们不是指针,我编辑了它。我说它可以解释为双指针,在 C 中数组和指针是密切相关的,但是是的,数组不是指针。这不是我要争论的问题,他问是否可以将其解释为指向字符串数组的指针,所以答案是肯定的。
【解决方案2】:

可能的解释是你应该传入一个指针的地址,而在返回时,指针将是一个 C 字符串数组。

这不是唯一可能的解释,但可能是最可能的一种。如果本机签名还要求一个指向整数的指针,它将写入返回数组的长度,则尤其如此。

要从 JNA 使用它:

PointerByReference pref = new PointerByReference();
IntegerByReference iref = new IntegerByReference();
nativeLib.call(pref, iref);
String[] strings = pref.getValue().getStringArray(0, iref.getValue());

如果没有指定长度,JNA 将寻找一个 NULL 值来标记字符串数组的结尾。

【讨论】:

    猜你喜欢
    • 2013-03-07
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2011-08-27
    • 2019-10-17
    相关资源
    最近更新 更多