Использование указателей
Указатели позволяют максимально эффективно решить проблему возврата нескольких значений из функции, а также возврата больших объектов, копирование которых нежелательно. В случае, если требуется вернуть несколько значений, можно воспользоваться следующим синтаксисом:
void GetMouseState(int *p_keys, int *p_x, int *p_y) { *p_keys = …; *p_x = …; *p_y = …; }
Поскольку функция GetMouseState получает копии адресов объектов, то при изменении их через указатели меняются сами объекты, а не их копии. Обратите внимание – копируются указатели, а не сами объекты! Формально здесь происходит то же самое, что и в случае со ссылками.
Вызов этой функции будет выглядеть следующим образом: int keys,x,y; GetMouseState(&keys,&x,&y);
В данном случае, в отличие от передачи аргумента по ссылке, клиентский код явно указывает, что он передаёт адрес объекта. Передавая адрес клиент подразумевает, что, скорее всего, адрес будет использован для изменения значения. Исходя из этого, рекомендуется для обеспечения работы с самим объектом, а не с его копией, использовать константные ссылки, а для ситуации, когда вызываемая функция планирует изменять значение – использовать указатели. Во втором случае в клиентском коде явно видно, что берётся адрес объекта и следует ожидать его изменения. Альтернативный вариант с использованием структуры в качестве возвращаемого значения:
|