使用C中的指针将代码转换为Java代码

时间:2012-01-31 23:55:46

标签: java c pointers

我在理解如何使用Java中的Stringchar[]来编写下面的代码时遇到了一些困难。

void xyz(char *a, int startIndex, int endIndex)
{
   int j;
   for (j = startIndex; j <= endIndex; j++)
   {
       doThis((a+startIndex), (a+j));
       xyz(a, startIndex+1, endIndex);
   }
}

此处char *a指向char name[]

的起始位置

上面只是一些随机函数,但我只想要在Java中使用char*和字符索引char[]的逻辑

4 个答案:

答案 0 :(得分:3)

正如您所指出的,C中的char *指向字符数组的开头(这是C管理字符串的方式)。

在C中,char的大小是一个字节,指针总是指向一个字节的开头。你的C字符串是一个字符数组,所以在指针上添加1可以将字符串的开头向右移动一个字符。

这意味着C代码:

char *a;
// Set the String here
a = a + 1;

在Java中翻译为:

String a;
// Set the String here
a = a.substring(1);

或者如果您使用的是char数组:

char[] a;
// Set the array contents here
char[] copyTo = new char[a.length];
System.arraycopy(a, 1, copyTo, 0, a.length);
a = copyTo;

Java会更加谨慎地保护C,但是。例如,如果你有一个零长度的字符串,C代码有可能是段错误(崩溃应用程序)或者给你一个充满内存垃圾的乱码(然后,最终崩溃应用程序),而Java代码将抛出一个异常(通常是一个IndexOutOfBoundsException),你可以希望它可以干净利落地处理。

请记住,Java中的String是不可变的。你不能改变它们,你只能创建新的字符串。幸运的是,String有几个内置函数,允许您执行许多标准操作,例如将String的一部分替换为另一个并返回结果。字符数组 是可变的,您可以更改其中的字符,但是使用正确的String类会损失很多好处。

答案 1 :(得分:3)

基于评论主题的重新提问:

您无法更改Java String的字符。如果您需要修改字符序列,请使用支持setCharAt(int, char)insert(int, char)append(char)的{​​{3}}。您可以使用new StringBuilder(myString)String转换为StringBuilder,将stringBuilder.toString()转换回来。

这是完全合法的Java代码 - 它不是代码臭,它只是你使用可变字符序列的方式。

答案 2 :(得分:0)

简单回答:

你无法做到这一点。 Java仅供参考。您无权访问内存位置信息,因此无法对其进行算术运算。

更长的答案:

看起来你正在传递一个字符串进行操作。您有几种方法可以模拟它。

  1. 您可以将字符串转换为字符数组,然后传入char []。如果您的操作不是任何类型的标准字符串操作并且完全自定义,那么这可能就是您需要做的。请记住,您不能更改传入的数组的大小,也不能在函数完成后在新数组中有一个点。 (再次,只通过价值)。只能修改数组现有元素的值。
  2. 您可以传入String并使用String方法,例如subString()(您的开始和结束索引似乎建议,但这可能无法满足您的需求。请注意,字符串是不可变的,但您只能通过return语句获得结果。
  3. 如果确实需要修改传入的对象的内容,可以传递一个StringBuilder,StringBuffer或CharBuffer对象并修改掉。
  4. 还有一个黑客可以用来绕过传递的传递,但除了在特殊情况下它的风格很差。传入一个你需要修改的数组,所以在这种情况下,一个字符数组数组将允许你设置一个新的子数组,并有效地通过引用传递,但尽量不要这样做:)

答案 3 :(得分:0)

如果你的方法修改了你不能使用String的值,因为它是不可变的,你可以使用StringBuilder代替。

如果您的方法已经依赖于char数组并且您需要偏移量,则可以使用CharBuffer来包装数组。它不支持String操作,但支持子范围的视图,这似乎是您在doThis()方法中使用的视图。