如何将数组传递给Java中的函数

时间:2014-08-26 17:40:51

标签: java c parameter-passing function-calls

在C中,当我们在函数调用中传递数组时,只传递一个指向数组的指针以帮助内存和时间效率,并且我们无法计算被调用函数中数组的大小。我们必须将大小作为参数传递给被调用的函数。 但是,在Java中,我们也可以计算被调用函数中数组的大小。所以,它并没有影响内存效率,因为我认为整个数组都被传递给被调用的函数。有人可以详细说明一下吗?

5 个答案:

答案 0 :(得分:2)

java中的数组是一个对象,它包含元素和数组的大小。

传递数组时,只传递对数组对象的引用 - 数组不重复,并且方法中对数组所做的任何更改都将反映到调用环境。

答案 1 :(得分:2)

Java和C是完全不同的语言,它们以不同的方式处理数组非常;不要假设一个规则适用于另一个。

在Java中,数组是Object类的子类,并继承该类的所有属性和方法。 Java数组为数组元素留出了一块连续的内存块(至少,我认为它是连续的),但它们也为数组元数据和基数{{1}留出了内存方法。

在C中,数组只是类型为Object的元素的连续序列,没有其他元数据。

C源于早期的B语言;在B中,当你声明一个N元素数组时,编译器会留出N + 1" cells&#34 ;,其中一个将存储一个偏移到数组的开头,并且该单元格将绑定到标识;鉴于声明

T

你在内存中看到这样的东西:

auto arr[2];

Ritchie最初保留了这个单独的指针变量,但在向该语言添加结构类型时遇到了问题。最终,他完全摆脱了它,所以当你宣布一个数组时,你得到的只是:

        +---+        
   arr: |   |-----+
        +---+     |
         ...      |
        +---+     |
arr[0]: |   |<----+
        +---+
arr[1]: |   |
        +---+

指向第一个元素的指针没有单独的存储空间;相反,当您在表达式中使用数组名称时计算指针(即,除非它是一元 +---+ arr[0]: | | +---+ arr[1]: | | +---+ &运算符的操作数,sizeof将评估到数组的第一个元素的地址,或arr 1

在Java和C中,唯一传递给函数的是数组的引用(Java)或指针(C),而不是数组本身的副本。

<小时/> 1。因为没有单独的指针变量,&arr[0]arr都会给你相同的(数组的第一个元素的地址与数组的地址),但两个表达式的类型会有所不同;第一个是&arr,第二个是T *。请注意,在B中,T (*)[N] 为您提供与&arr不同的结果。

答案 2 :(得分:0)

数组按值传递,其中值是数组的内存地址。

另外,请在此处阅读我的详细回复State of an ArrayList in a recursive method

答案 3 :(得分:0)

这里的区别在于Java中的数组是知道自己大小的对象。我们仍然传递对数组的引用,只是被引用的内存具有未在C中携带的信息。

答案 4 :(得分:0)

Java中的

(几乎)一切都是指针(更具体地说是一个引用),而不是C,其中一切都是值。

一个小例子来说明:

在C:

struct MyStruct {
    int  myInt;
    bool myBool;
};
MyStruct a = { .myInt = 5, .myBool = true};
//following line will cause a CLONE of a to be put in b.
MyStruct b = a;

上面的代码声明了一个结构体,将其初始化并将克隆结构化为另一个结构体(意味着值被复制而不是引用,即更改一个不会改变另一个)。

在java中说明b = a仅复制引用(即更改a.myInt也将更改b.myInt),要在C中实现类似的内容,我们会写b指向MyStruct和州b = &a

的指针

因此,当向java中的方法传递参数时,我们实际上是将引用传递给该对象(除非我们使用原始类型,例如int,bool,char等)。 Java数组可以方便地预先填充它们的大小(在C中我们可以创建一个数组结构和一个int作为它的长度)。