У вас в основном есть 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);
.
Если вы передадите по значению (как в вашем коде), он просто передаст копия аргумента и функция будет работать с этой копией, а не с фактической переменной.
Для подробного обсуждения взгляните на следующее.
В чем разница между передачей по сравнению с передачей по значению?