Как изменить глобальную структуру при передаче в качестве параметра функции (c ++)? - PullRequest
1 голос
/ 14 февраля 2020

допустим, у меня есть эта глобальная структура

struct input_shift_register
{
    bool not_used;
    int data;
    int *ptr_to_data;
};

, и я хотел бы передать ее экземпляр в функцию для изменения своих данных

void share_data(input_shift_register shift) {
shift.data = 5;
}

Это изменит только локальная копия структуры внутри функции. Как я могу изменить "настоящую" глобальную структуру вместо этого? Мне жаль, что это, вероятно, очень легко, но я просто не могу найти ответ в Интернете.

Ответы [ 2 ]

5 голосов
/ 14 февраля 2020

У вас в основном есть 2 варианта.

  • Передача по ссылке
void share_data(input_shift_register& shift) {
  shift.data = 5;
}

Это позволит убедиться, что ваш параметр функции является ссылкой (псевдонимом), привязанным к функции аргумент, следовательно, вы имеете дело с фактической переменной, которая передается функции на вызывающем сайте.

  • Передача по указателю
void share_data(input_shift_register* shift) {
  shift->data = 5;
}

Это обеспечит вам передают адрес переменной, следовательно, на вызывающем сайте вы должны передать адрес в качестве аргумента, т.е. share_data(&shift_register);.

Если вы передадите по значению (как в вашем коде), он просто передаст копия аргумента и функция будет работать с этой копией, а не с фактической переменной.

Для подробного обсуждения взгляните на следующее.

В чем разница между передачей по сравнению с передачей по значению?

2 голосов
/ 14 февраля 2020

Ссылка на передачу и значение передачи - это два способа, которые вы можете использовать для своих конкретных потребностей c.

Однако вы также можете попробовать это:

input_shift_register share_data(input_shift_register shift) 
{
    shift.data = 5;
    return shift;
}


input_shift_register var;
var = share_data(var)

Если вы определяете свою функцию таким образом, то у вызывающей стороны есть возможность либо присвоить возвращаемое значение функции либо исходной var, либо какой-либо другой переменной той же структуры.

Это еще один способ сделать то же самое. Я бы не сказал, что он лучше оптимизирован, но он может удовлетворить некоторые специфические c требования.

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