将数组作为参数传递:C和Java
在我提问之前,我会注意到我知道:将数组作为参数传递:C和Java,java,c,Java,C,在我提问之前,我会注意到我知道: 在C语言中,我们可以通过值调用方法,也可以通过引用调用方法 在Java中,我们只能按值调用方法(当我们传递对象时,我们传递的是对象引用的值,而不是对象引用本身) 在C和Java上下文中,指针和引用之间存在差异 现在谈问题: 考虑一个数组: arr = {1,2,3,4,5} //len =5 在C中,我可以做以下两件事: foo(arr, len); bar (arr+ 2, len -2); 函数定义: foo(int *a, int l) { ...
arr = {1,2,3,4,5} //len =5
在C中,我可以做以下两件事:
foo(arr, len);
bar (arr+ 2, len -2);
函数定义:
foo(int *a, int l) {
...
printf("%d", &a[0]; //prints 1
...
}
bar (int *a, int l){
printf("%d", &a[0]; //prints 3
...
}
我们可以看到,函数栏中的数组a以值3开头,因为它包含arr[2](原始数组)的地址。如果要将子数组视为起始索引为0的新数组,这是在C中传递数组的一种简洁方法
我想知道,尽管以下调用在C和Java中具有不同的含义,但Java中是否也可以实现同样的功能:
foo(arr);
Java缺少本机切片函数(与C中关于数组开头的隐式切片函数或几种现代语言中的显式切片函数一样),但如果需要,可以轻松构建自己的类来包装数组、索引和长度。Java缺少本机切片函数(与C中关于数组开头的隐式类或几种现代语言中的显式类一样)但如果需要,可以很容易地构建自己的类来包装数组、索引和长度。在C和Java中传递数组时,思路是一样的 在Java中,为对象传递的所有内容都是对对象的引用,即指针。在Java中,您永远不会说:A*A=new A();您只需编写A=new A();缺少*就是区别。否则,A的行为与指针完全相同
原语变量是按值传递的。在C和Java中传递数组的想法是一样的 在Java中,为对象传递的所有内容都是对对象的引用,即指针。在Java中,您永远不会说:A*A=new A();您只需编写A=new A();缺少*就是区别。否则,A的行为与指针完全相同
原语变量是按值传递的。如果您的问题是是否可以通过执行类似于
arr+2
中的指针算术来处理数组的元素,那么答案是否定的
但是,您可以通过传入数组和开始读取数组的位置来实现相同的效果。如果您的问题是是否可以通过执行类似于
arr+2
中的指针算术来寻址数组的元素,那么答案是否
但是,您可以通过传入数组和开始读取数组的位置来实现相同的效果。java中数组的底层结构在头部有一个额外的元素,指示其长度。因此,您的原始数组将是
{len,1,2,3,4,5}
由JVM存储。这样做是为了防止java在数组上的索引外操作“安全”。这也使得在java中进行指针运算几乎不可能
要在java中执行类似的操作,通常需要使用某种类型的
缓冲区类来包装数组。java中数组的底层结构的头部有一个额外的元素,指示其长度。因此,原始数组将是{len,1,2,3,4,5}
由JVM存储。这样做是为了防止java在数组上的索引外操作“安全”。这也使得在java中进行指针运算几乎不可能
要在java中执行类似的操作,通常需要使用某种类型的Buffer
类来包装数组。是的,只需添加一个参数int off
或使用IntBuffer
类即可
void foo(int[] a,int off, int l) {
...
System.out.printf("%d", a[off]; //prints 1
...
...
}
f(a,2,l);
void foo(IntBuffer a,int l){
System.out.printf("%d",a.get(0));
}
IntBuffer buffer = IntBuffer.wrap(a,2,a.length-2);
foo(buffer,l);
是的,只需添加一个参数intoff
或使用IntBuffer
类
void foo(int[] a,int off, int l) {
...
System.out.printf("%d", a[off]; //prints 1
...
...
}
f(a,2,l);
void foo(IntBuffer a,int l){
System.out.printf("%d",a.get(0));
}
IntBuffer buffer = IntBuffer.wrap(a,2,a.length-2);
foo(buffer,l);
2.在Java中,我们只能按值调用方法,这是不正确的!C和Java都只有按值传递语义。在C中,可以按值传递指针,在Java中,可以按值传递引用,但都是按值传递。您的foo()和bar()函数是完全相同的。为什么要在示例中进行区分?在java中,您总是可以执行以下操作:foo(数组,偏移量,长度)java API不是倾向于使用arr,offset,length
来实现这一点(将数组的一部分作为参数传递)?2.在Java中,我们只能按值调用方法,这不是真的!C和Java都只有按值传递语义。在C中,您可以按值传递指针,在Java中,您可以按值传递引用,但两者都是按值传递的。您的foo()和bar()函数是完全相同的。为什么要在示例中进行区分?在java中,您总是可以执行以下操作:foo(数组,偏移量,长度)java API不是倾向于使用arr,offset,length
来实现这一点(将数组的一部分作为参数传递)?但是在java中,您不能调用“bar(arr+2,len-2);”?遗憾的是,在Java中没有对数组进行切片。此外,arr+2使用基于解引用指针类型的基本表示法。在Java中不是这样。但在Java中不能调用“bar(arr+2,len-2);”?遗憾的是,在Java中没有对数组进行切片。此外,arr+2使用基于解引用指针类型的基本表示法。在Java中不是这样的。这是一种非常常见的Java模式!这是一种非常常见的Java模式!