Home > OS >  Can we pass an array to any function in C ?
Can we pass an array to any function in C ?

Time:01-22

I have passed an array of size 10 to a funtion to sort the array reversely, but it's going wrong after rightly sorting first five elements of the array. I want to sort the array 'std' reversely here,

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

CodePudding user response:

There's basically three things wrong with your code.

  1. You aren't swapping anything
  2. You have to swap the first half of the array with the second half, not swap the whole array. If you do that then everything gets swapped twice, so that nothing changes
  3. You should print the reversed array after you have finished the reverse, not while you are doing the reverse.

Here's some code that fixes all these problems

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

CodePudding user response:

Yes you can. I usually don't use "C" style arrays anymore (they can still be useful, but the don't behave like objects). When passing "C" style arrays to functions you kind of always have to manuall pass the size of the array as well (or make assumptions). Those can lead to bugs. (not to mention pointer decay)

Here is an example :

#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;
}
  • Related