Nahom Ketema
Nahom Ketema

Reputation: 1

How do I pass a function with an argument of a structure passed by reference?

I was working on my program and noticed that it doesn't compile. I was wondering why I can't pass my structure array as an array of references. My code is down below

#include <iostream>
#include <cstring>
using namespace std;

struct a{
        int name;
};
void input(a & array1[10]){
        for(int i=0;i<10;i++){
                array1[i].name=i+1;
        }
}

void print(a & array1[10]){
        for(int i=0;i<10;i++){
                cout<<array1[i].name<<endl;
        }
}
int main(){ 
        a array1[10];
        input(array1[10]);
        print(array1[10]);
}

Upvotes: 0

Views: 54

Answers (2)

aep
aep

Reputation: 1675

Your syntax to pass the array by reference is wrong.

Please see the working code below.

#include <iostream>
#include <cstring>
using namespace std;

struct a{
        int name;
};
void input(a  (&array1)[10]){
        for(int i=0;i<10;i++){
                array1[i].name=i+1;
        }
}

void print(a (&array1)[10]){
        for(int i=0;i<10;i++){
                cout<<array1[i].name<<endl;
        }
}
int main(){ 
        a array1[10];
        input(array1); // make sure you simply pass the array name
        print(array1);
}

Try it out yourself

As enforced by the syntax of the language parenthesis that enclose array1 as in (&array1) are necessary. If you don't use them you're simply passing an array of reference not a referene to an array.

array1[10] is the 10th element of the array(which actually in your case doesn't exists, it's simply out-of-array-bound access), instead you need to pass the address of the first element of the array which is the same as array name i.e. the array name decays to a pointer.

Upvotes: 1

selbie
selbie

Reputation: 104524

When you pass an array into a function:

  • <opinion> The array degrades to a pointer. So you might as well have the function declare the parameter as a pointer, "a*", instead of as an array, a[].

  • The function has no idea how many items are in the array parameter. You should get in the habit of passing "size" as a parameter to a function when you pass the array.

    • On the flip side, arrays passed as pointers are inherently a reference parameter not a value (copy of) parameter. So you are implicitly meeting your goal of passing your array and all the items in the array by reference.

This is probably what you want.

#include <iostream>
#include <cstring>
using namespace std;

struct a {
    int name;
};

void input(a* array, size_t count){
    for(int i=0; i<count; i++) {
        array[i].name = i + 1;
    }
}

void print(a* array, size_t count) {
    for(int i=0; i<count; i++) {
        cout<<array[i].name<<endl;
    }
}
int main() { 
    a array1[10] = {};  // zero-init the array of a's
    input(array1, 10);
    print(array1, 10);
}

Upvotes: 1

Related Questions