Как передать функцию с аргументом структуры, переданной по ссылке? - PullRequest
0 голосов
/ 12 февраля 2020

Я работал над своей программой и заметил, что она не компилируется. Мне было интересно, почему я не могу передать свой структурный массив как массив ссылок. Мой код ниже

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

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

Когда вы передаете массив в функцию:

  • Массив ухудшается до указателя. Таким образом, вы также можете сделать так, чтобы функция объявляла параметр как указатель "a*", а не как массив, a[].

  • Функция не знает, сколько элементов содержится в параметре массива. При передаче массива нужно привыкнуть передавать «размер» в качестве параметра функции.

    • С другой стороны, массивы, переданные как указатели, по своей сути являются ссылочным параметром, а не значением ( копия) параметра. Таким образом, вы неявно достигаете своей цели передачи массива и всех элементов массива по ссылке.

Это, вероятно, то, что вы хотите.

#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);
}
1 голос
/ 12 февраля 2020

Ваш синтаксис для передачи массива по ссылке неверен.

Пожалуйста, посмотрите рабочий код ниже.

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

Попробуйте сами

В соответствии с синтаксисом круглых скобок языка, которые заключают в себе массив1, как в (&array1), необходимо. Если вы не используете их, вы просто передаете массив ссылок , а не референс массиву .

array1[10] - это 10-й элемент массив (который на самом деле в вашем случае не существует, это просто доступ за пределы массива), вместо этого вам нужно передать адрес первого элемента массива, который совпадает с именем массива, т.е. имя массива распадается на указатель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...