如何将数组传递给函数?

时间:2014-10-23 07:39:23

标签: java c++ c arrays memory-address

请考虑以下事项:

String[] array = {1,2,3,4};

myFunction(array);

public void myFunction(String[] array){
//some task here
}

我今天不得不回答这个问题。

如何将数组传递给函数?意味着底层技术是什么?

当我没有回答时,我被告知以下情况。

通过添加一些 x字节,传递第一个元素的地址,并从第​​一个元素的地址获取其他连续元素。

这种情况会发生在每种编程语言中还是只发生在c和c ++中?

谢谢!

2 个答案:

答案 0 :(得分:4)

不,在Java中,例如数组是对象。它们像传递给方法的任何其他对象一样被传递:该方法将整体引用数组对象,而不是对第一个元素的引用。

取自this page

  

所有类和数组类型都继承(第8.4.8节)类Object

的方法

Java没有“指针”的概念,与C或C ++(内存中的地址)的意义相同,即对象引用并不真正指向存储对象的内存位置。

答案 1 :(得分:3)

理论上讲,每种语言都不同。但是:

  • 在C中,函数不能将数组作为参数。什么时候 你声明一个数组参数,类型是自动的 转换成指针,所以没有什么不同 void f( int a[5] )void f( int* )。 (这经常是 总结说数组不是第一类对象。) 出于C兼容性的原因,C ++遵循相同的规则,但是 在C ++中,通常不会将数组作为参数传递 无论如何,如果你这样做,你会通​​过引用传递它,在哪里 这种转换为指针不会发生。 (即 void f( int (&a)[5] ) void f( int* &a )相同。)

  • 在Java和其他一些近期语言中,应有尽有 (或几乎),包括数组是对象和参数, 变量等是指向这些对象的指针。所以在Java中,你 传递指向数组的指针,但是完整的数组对象 有关其大小等的所有信息 在C ++中传递std::vector<int>*

  • 在许多语言中(大多数是旧的?),如Pascal和 Modula系列的语言,数组只是一种对象类型 像其他任何一样。如果你不采取任何特定的行动, 数组将通过值传递,并带有完整的副本 阵列

  • 最早的语言,如Fortran或Algol,每个 语言通常有自己非常特殊的传递方式 数组,虽然一般来说,它们遵循与其他规则相同的规则 类型。 (像Cobol或Basic这样的早期语言甚至没有 支持将参数传递给函数,至少在它们中 最早的变种。)

在你今天可能会看到的语言中,我认为 Java模型占主导地位。 C仍然是异常值,而C ++ 为您提供选择:您可以按值传递std::vector或 通过引用(但建议参考性能 原因)。