首页 > 解决方案 > 从已传递给函数的数组中复制

问题描述

int getWinnableTwo(char thisArray[9]) { 
    char oneArray[9];

    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));

由于某种原因,这不会编译,而使用全局数组则可以。我想这是因为数组是通过引用传递的,但是我该怎么做才能使它工作呢?

错误:

不匹配的类型 'const std::valarray<_Tp>' 和 'char*'</p>

标签: c++arrays

解决方案


当您将数组作为参数传递给函数时,它会衰减为原始指针。如果您将不同大小的数组传递给您的函数,您会看到这一点,您可能会对它编译感到惊讶:

char test[1];
getWinnableTwo(test);

你甚至不需要传递一个数组:

char test;
getWinnableTwo(&test);

你的功能相当于:

int getWinnableTwo(char* thisArray) { 
    char oneArray[9];
    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
    return 0;
}

您不能在原始指针上调用std::beginstd::end,因为编译器无法知道指针指向的数据的大小。

一种解决方案是通过引用传递数组:

int getWinnableTwo(char(&thisArray)[9]) { 
    char oneArray[9];

    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
    return 0;
}

这有一个额外的好处,你现在只能通过char [9]而不是任何其他类型。

更多的 c++ 解决方案是使用std::array它,您可以选择通过引用或值传递,并且不会衰减到指针:

int getWinnableTwo(std::array<char, 9>& thisArray) { 
    std::array<char, 9> oneArray;

    std::copy(std::begin(thisArray), std::end(thisArray), std::begin(oneArray));
    return 0;
}

推荐阅读