【问题标题】:How is array passed to a function?数组如何传递给函数?
【发布时间】:2014-10-23 07:39:22
【问题描述】:

考虑以下几点:

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

myFunction(array);

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

我今天必须回答这个问题。

数组如何传递给函数?表示底层技术是什么?

当我没有回答时,我被告知以下内容。

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

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

谢谢!

【问题讨论】:

  • “这在每种编程语言中都会发生吗?”当然不是。并非所有语言都有函数和数组。 C 和 C++ 都不允许您将数组传递给函数。只有指向第一个元素的指针或(在 C++ 中)对数组的引用。
  • 数组分配连续的内存位置,所以我认为它可能在 C/C++ 以外的语言中。
  • 那么这就是某些编程语言中数组的处理方式?
  • 只有 c 和 c++ 关心这种地址传递。指针的丑陋用法只有在 C 和 C++ 中(Java、C# 不需要你这样做,它们只需要数组)。

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


【解决方案1】:

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

取自this page

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

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

【讨论】:

  • Java 肯定有指针;它只是称它们为引用。堆栈上的实际指针是否直接指向对象无关紧要;这是一个实现细节(也没有要求 C++ 指针中的物理数据指定内存中的物理地址)。
  • 当然,C++ 中指针的概念与 Java 中的指针概念完​​全不同。在 Java 中,您可以将对对象的每个引用视为“指针”。
【解决方案2】:

理论上,每种语言都是不同的。然而:

  • 在 C 中,函数不能将数组作为参数。什么时候 你声明一个数组参数,类型是自动的 转换成指针,所以没有区别 void f( int a[5] )void f( int* )。 (这经常 总结为数组不是一流的对象。) 出于 C 兼容性的原因,C++ 遵循相同的规则,但 在 C++ 中,通常不会将数组作为参数传递 无论如何,如果你这样做了,你会通过引用传递它,在哪里 不会发生这种到指针的转换。 (IE。 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 或 通过参考(但建议参考性能 原因)。

【讨论】:

    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 2012-07-23
    • 2017-06-03
    • 2019-09-24
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多