在C++中,我们可以将数组传递给任何函数吗?

sqxo8psd  于 2023-01-22  发布在  其他
关注(0)|答案(2)|浏览(149)

我传递了一个大小为10的数组给一个函数,让它对数组进行反向排序,但是在正确排序了数组的前五个元素之后,它出错了。我想在这里对数组'std'进行反向排序,

# include <iostream>
using namespace std;

int reverse(int a[]); //funtion prototype

int main()
{
    int std[10] = {0,1,2,3,4,5,6,7,8,9};
    reverse(std);
}

int reverse(int a[]) //funtion defination
{
    int index = 0;
    for (int i = 9; i >= 0; i--) 
    {   
        a[index] = a[i]; //swaping values of the array
        cout << a[index] << " ";
        index++;    
    }   
}
67up9zun

67up9zun1#

你的代码基本上有三个问题。
1.你不能交换任何东西
1.你必须把数组的前半部分和后半部分交换,而不是交换整个数组,如果你这样做,那么所有的东西都会交换两次,所以什么都不会改变
1.应该在完成反转后打印反转阵列,而不是在执行反转操作时打印。
下面的代码可以修复所有这些问题

# include <iostream>
# include <utility>

void reverse(int a[]);

int main()
{
    int std[10] = {0,1,2,3,4,5,6,7,8,9};
    reverse(std);
    // print the array after reversing it
    for (int i = 0; i < 10; ++i)
        std::cout << std[i] << ' ';
    std::cout << '\n';
}

void reverse(int a[])
{
    for (int i = 0; i < 5; ++i) // swap the first half of the array with the second half
    {   
        std::swap(a[i], a[9 - i]); // real swap
    }   
}
vsikbqxv

vsikbqxv2#

是的,你可以。我通常不再使用"C"风格的数组了(它们仍然有用,但是它们的行为不像对象)。当把"C"风格的数组传递给函数时,你总是需要手动传递数组的大小(或者做一些假设)。这可能会导致bug。(更不用说指针衰减了)
下面是一个例子:

#include <array>
#include <iostream>
// using namespace std; NO unlearn trhis

template<std::size_t N>
void reverse(std::array<int, N>& values)
{
    int index = 0;
    // you only should run until the middle of the array (size/2)
    // or you start swapping back values.

    for (int i = values.size() / 2; i >= 0; i--, index++)
    {
        // for swapping objects/values C++ has std::swap
        // using functions like this shows WHAT you are doing by giving it a name
        std::swap(values[index], values[i]);
    }
}

int main()
{
    std::array<int,10> values{ 0,1,2,3,4,5,6,7,8,9 };
    reverse(values);

    for (const int value : values)
    {
        std::cout << value << " ";
    }

    return 0;
}

相关问题