将数组/指针从C转换为Java

将数组/指针从C转换为Java,java,c,arrays,pointers,Java,C,Arrays,Pointers,我正在尝试将C语言的程序重新编写为java语言。我没有C的经验,但是有些C++,所以我理解一些指针/数组的东西。但我有点困惑…我得到了以下C代码: void ProcessStatus(Char *Stat){ DWORD relayDate; DWORD APIDate; version3=false; version4=false; version9=false; tiltAngle = false; ver4features=0;

我正在尝试将C语言的程序重新编写为java语言。我没有C的经验,但是有些C++,所以我理解一些指针/数组的东西。但我有点困惑…我得到了以下C代码:

void ProcessStatus(Char *Stat){
    DWORD relayDate;
    DWORD APIDate;

    version3=false;
    version4=false;
    version9=false;
    tiltAngle = false;
    ver4features=0;
    tooNew=false;
    ProgRev=0;

    switch(Stat[14]){
据我所知,函数
ProcessStatus
传递了一个指向字符的指针;我假设,在提供的代码的最后一行中,
Stat[14]
被称为其在数组中

所以我困惑的是如何在Java中传递指向数组中字符的指针


任何帮助都将不胜感激,即使这有助于我理解C代码。谢谢。

因为C没有内置的字符串类型,所以C中的字符串表示为字符数组。在C语言中,向数组中的第0个元素传递指针等同于向数组传递引用,我认为这段代码就是这么做的。本质上,先用字符串Stat替换char*Stat,用switch(Stat.charAt(14))替换switch(Stat[14])

,澄清一下,它不是char,而是char
Char
带有大写字母
C
是一些用户定义的类型。它可以是字符的typedef,也可以是其他的东西;我们不知道


其次,传递给方法的显然是指向
Char
对象块的第一个元素的指针。最接近的等价物是Java数组,但取决于您如何操作,您可以将数据结构完全保留在C中,将指针作为
long
传递给Java,并让Java通过调用您提供的本机函数来操作它。Java数组与C.</P> < P>中的“数组”或连续分配对象序列有很大的不同,当你看到“代码> char */CODE >(我不知道C或C++中你最初的上限<代码> Char <代码> >时,java等价物是代码> >或<代码> char []/Cord>。前者是字符串类,后者是字符数组

使用
String
的等效函数签名如下所示;我们使用访问第15个字符:

void ProcessStatus(String Stat){
    // ...
    switch (Stat.charAt(14))
    // ...
}
char[]
的等价项如下所示(由于它是一个数组,我们对它进行索引,就像在C中使用
char*
char[]
一样):


很难说是字符串还是已传递的原始数据

对于string,使用Java的内置string类

void ProcessStatus( String stat)
{
  ...

  switch ( stat.charAt( 14 ) )
  {
  } 
}
如果是原始数据数组,请使用
byte
array

void ProcessStatus( byte[] stat)
{
  ...

  switch ( stat[ 14 ] )
  {
  } 
}

顺便说一句,C的
char
数据类型在Java中被转换为
byte
类型chartype表示2字节长的UTF-16字符<代码>字节就是它本身(8位,有符号)。

C中的字符*是字符串。所以字符串在java中应该适用。“Char”上的大写字母“C”是打字错误还是故意的——也就是说,它是C内置类型
Char
还是其他什么?什么?@mihail不太清楚。C中的char*可以是字符串,也可以是存储二进制数据的通用数组。由于C中的char是8位,而java中的char是16位,因此正确的转换是java“byte[]”中的字节数组。对不起,我的描述不够详细。这段代码实际上使用了PalmPilotAPI/库,我很确定大写字母C是它们的定义。无论哪种方式,正确的转换都是byte[]C中的字符宽8位,java中的字符宽16位。如果char*在C中是一个字符串,那么您可以在java中使用string,但如果char*用于存储原始二进制数据,则应使用byte[]而不是char[]。@FilipePalrinhas:这取决于调用函数的方式。如果整个代码库正在从C转换为Java,那么您将使用
char[]
。如果要从C调用该函数,或者出于任何其他原因使用8位数据,那么当然,您认为它应该是
byte[]
。根据公认的答案,看起来它实际上不是字符串数据,因此
byte[]
对于OP来说是正确的。“如果整个代码库都从C转换为Java,那么您应该使用char[]”。如果数据是字符串,您可以使用char[]或string,但在java中最正确、最自然的方法是直接使用string。@FilipePalrinhas:呃,是的,非常正确。我的意思是
char[]
String
,具体视情况而定。您是指第二个ProcessStatus()函数中的stat[14]而不是byte[14],对吗?为什么是byte[14]?不是字节类型吗?我认为他给统计局打电话是正确的[14]。但我是OP,真的不知道哈哈,让我知道。@JuiCe:他用“开关(字节[14])”代替了“开关(状态[14])”,但已经纠正了错误。现在一切都好了!:)
void ProcessStatus( byte[] stat)
{
  ...

  switch ( stat[ 14 ] )
  {
  } 
}