从已传递给函数的数组中复制

时间:2018-11-27 07:27:57

标签: c++ arrays

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

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

由于某种原因,使用全局数组时无法编译。我想这是因为数组是通过引用传递的,但是我该怎么做才能使这项工作呢?

错误:

  

不匹配的类型“ const std :: valarray <_Tp>”和“ char *”

3 个答案:

答案 0 :(得分:4)

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

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;
}

答案 1 :(得分:3)

尝试这个:

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

答案 2 :(得分:2)

您可以使用std :: array来实现此目的。

#include <array>
#include <algorithm>

int getWinnableTwo(const std::array<int, 9>& arrayToCopy) {
    std::array<int, 9> destinationArray;

    std::copy(std::begin(arrayToCopy), std::end(arrayToCopy), std::begin(destinationArray));
}

int main()
{
    std::array<int, 9> arrayToCopy{ 1,2,3,4,5,6,7,8,9 };
    int result = getWinnableTwo(arrayToCopy);
}