【问题标题】:What is the difference between A and A[] in function parameter?函数参数中的 A 和 A[] 有什么区别?
【发布时间】:2014-02-02 22:40:09
【问题描述】:
//function prototype at the top
void fillRandArray(int A[], int number, int maxNum);

//function declaration
void fillRandArray(int* A, int number, int maxNum) {
   for(int i = 0; i < number; i++) {
      A[i] = rand() % maxNum + 1; 
   }
}

int A[MAX_STUDENTS];

fillRandArray(A, number, 44);

代码看不懂,所以原型集int A[] 然后声明集int* A

当我们传递参数时,我们不应该这样传递吗...

fillRandArray(A[MAX_STUDENTS], number, 44); <---- ???

【问题讨论】:

标签: c++ parameters


【解决方案1】:

下面的代码是传递一个数组的名字,也就是一个地址。

void fillRandArray(int A[], int number, int maxNum);

下面的代码只传递一个地址的名称,在这种情况下恰好是 A。他们基本上在做同样的事情。

void fillRandArray(int* A, int number, int maxNum)

你不会像下面这样传递参数:

fillRandArray(A[MAX_STUDENTS],..., ...);

因为您告诉编译器期望的是地址,而不是数组的元素。所以你只需传递它 A (即数组的名称,也是起始地址)。所以它看起来像这样:

fillRandArray(A, number, 44);

如果我解释得不够清楚,请提出更多问题。

【讨论】:

  • 谢谢,所以数组是通过引用传递的?因为它不需要 *
  • 是的,我相信数组在 C++ 中是通过引用传递的。引用意味着对实际数组(即井地址)的引用被传递给函数,而不是通过值传递,这只是一个副本。如果您不希望在函数中更改数组,则可以始终将 const 放在数组前面。
  • 数组的名称不是地址。
  • @MrPickle5 C++ 唯一一次通过引用传递任何东西是当您将参数声明为引用时。 C++ 根本不允许传递 C 样式数组(因为 C 不允许)。因此,您可以声明函数以获取指针,并依靠隐式数组到指针的转换(尽可能避免),或者您可以声明对数组的引用。
【解决方案2】:

问题是 C 风格的数组不能作为参数传递 到一个函数。当您将int a[] 作为参数写入时 一个函数,编译器将其转换为int* a。在 另外,如果您提供一个维度(例如int a[10]),它是 简单地忽略了。

此外,数组可以转换为指针,并且会经常这样做 的上下文。这就是fillRandArray(A, number, 44) 中发生的事情;数组A 隐式转换为指针。

fillRandArray(a[MAX_STUDENTS], number, 44),这个 第一个元素的数组索引;和你的 声明,它传递一个int(不是数组或指针), 除了它访问数组末尾之外的一个,所以它是 未定义的行为。

一般来说,您希望避免这种情况(尽管使用main,您 不能):该函数应该采用std::vector<int>& a,或者在一些特殊情况下采用int (&amp;a)[N](在这种情况下, 该函数应该是一个模板,N 是一个模板 范围)。所以你可以写:

template <size_t N>
void fillRandArray( int (&a)[N], int maxNumber )
{
    for ( int i = 0; i != N; ++ i ) {
        a[i] = rand() % maxNum + 1;
    }
}

(但是对于这种事情,std::vector 是更可取的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2018-06-27
    • 2013-12-24
    • 1970-01-01
    • 2011-11-17
    • 2015-08-16
    相关资源
    最近更新 更多