请考虑以下事项:
String[] array = {1,2,3,4};
myFunction(array);
public void myFunction(String[] array){
//some task here
}
我今天不得不回答这个问题。
如何将数组传递给函数?意味着底层技术是什么?
当我没有回答时,我被告知以下情况。
通过添加一些 x字节,传递第一个元素的地址,并从第一个元素的地址获取其他连续元素。
这种情况会发生在每种编程语言中还是只发生在c和c ++中?
谢谢!
答案 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
或
通过引用(但建议参考性能
原因)。