Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Array changes it's values inside a function but other variable don't

#include <iostream>

using std::cout;
using std::cin;
using std::endl;

void func(int arr[5], int n1, int n2)
{   
    cout << "INSIDE func()" << endl;
    arr[0]++, arr[3]++;
    for(int i = 0; i < 5; i++)
    {
        cout << arr[i] << ' ';
    }
    cout << endl;
    n1++, n2++;
    cout << n1 << ' ' << n2 << endl;
}

int main()
{
    int a = 3, b = 4;
    int arr[5] = {0,0,0,0,0};
    
    func(arr,a,b);
    cout << "INSIDE main()" << endl;
    for(int i = 0; i < 5; i++)
    {
        cout << arr[i] << ' ';
    }
    cout << endl;
    cout << a << ' ' << b << endl;

    return(0);
}

So, why does arr[5] changes it’s values in func() function, but variables a,b don’t.
Why does that happen? I know that to a,b change it’s values i have to pass the reference of variables a , b to function func().

F.e:
fill(int arr[5], int &n1, int &n2)
{
   /* code */
}

But why don’t we pass arrays to functions in the same way?

OUTPUT:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

INSIDE func()
1 0 0 1 0
4 5
INSIDE main()
1 0 0 1 0
3 4

>Solution :

This function declaration

void func(int arr[5], int n1, int n2);

is adjusted by the compiler to the declaration

void func(int *arr, int n1, int n2);

That is parameters having array types are adjusted by the compiler to pointers to array element types.

On the other hand, this call

 func(arr,a,b);

is equivalent to the call

 func( &arr[0], a, b );

That is the array designator arr used as the function argument is implicitly converted to a pointer to its first element.

So in fact elements of the array are passed to the function through a pointer to them because using the pointer arithmetic and dereferencing pointer expressions the function has a direct access to elements of the array. For example these expressions

arr[0]++, arr[3]++;

by the definition are equivalent to

( *( arr + 0 ) )++, ( *( arr + 3 ) )++;

As for the variables a and b then the function deals with copies of the values of these variables. If you want to get the same effect as with elements of the array you should define the function like

void func(int arr[5], int *n1, int *n2)
{   
    cout << "INSIDE func()" << endl;
    arr[0]++, arr[3]++;
    for(int i = 0; i < 5; i++)
    {
        cout << arr[i] << ' ';
    }
    cout << endl;
    ( *n1 )++, ( *n2 )++;
    cout << *n1 << ' ' << *n2 << endl;
}

and call it like

 func( arr, &a, &b );
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading