数组作为函数的参数

时间:2019-05-02 14:04:22

标签: c++ arrays arguments

在f()中,我接受最大大小为4的数组,但是当我传递大于4(这里为10)的大小的数组时,它仍然可以正常运行,我知道c ++中的数组默认作为指针传递,但是这种传递数组的方法何时有用?

#include<iostream>

using namespace std;

void f(int a[4]){
    for(int i  = 0;i < 3;i++){
        a[i] += 10;
    }
}

int main(){
    int a[10];
    for(int i = 0;i < 10;i++)
        a[i] = i;
    f(a);
    for(int i =0 ;i < 10;i++){
        cout<<a[i]<<" ";
    }
    cout<<"\n";
    return 0;
}

输出:10 11 12 3 4 5 6 7 8 9

3 个答案:

答案 0 :(得分:4)

  

我知道c ++中的数组默认情况下作为指针传递

正确。

此:

void foo(int a[4])

完全重写为:

void foo(int* a)

…,然后在调用该函数时,数组的名称将衰减为指针,与重写的“真实”参数类型匹配。

因此,您根本没有真正传递数组。

  

这种传递数组的方法何时有用?

从不。

这是继承自C的可耻的奇怪之处。有人可能会说[4]是对开发人员的有用提示,指出指向数组“应该”包含四个元素,但是现代的智慧是,这仅仅是不必要和危险的误导。

更好的选择包括:

  • 指针/大小对(两个参数):本身并没有那么危险,但是至少它并不在于类型,并会使您陷入一种错误的安全感!
  • 按引用排列:活泼可爱,但不太灵活
  • std::array<int, 4>(通过引用):如上所述,但更简洁

答案 1 :(得分:2)

如果要对传入数组的大小施加限制,则可以更改为“按引用传递”。

void f(int (&a)[4]){
    for(int i  = 0;i < 3;i++){
        a[i] += 10;
    }
}

void f(int a[4])void f(int* a)相同;这意味着您可以传递任何大小的数组,该大小在传递时会衰减到指针(即int*)。

答案 2 :(得分:2)

要么像{songyuanyao所示那样对f()进行更严格的限制,要么考虑使用C ++ std::array来代替:

#include <iostream>
#include <array>

// make an alias for the array you'd like to accept
using myarray_t = std::array<int, 4>;

// accept the array by reference
void f(myarray_t& a) {
    // use a range based for loop to access elements by reference
    for(int& a_i : a) a_i += 10;
}

int main() {
    // declare your array
    myarray_t a;
    for(size_t i = 0; i < a.size(); ++i) a[i] = static_cast<int>(i);
    f(a);
    // and you can use a range based for loop to extract by value too 
    for(int a__i : a)
        std::cout << a_i << " ";

    std::cout << "\n";
    return 0;
}