Как уже говорили другие, & означает, что вы берете ссылку на фактическую переменную в функцию, а не на ее копию. Это означает, что любые изменения, внесенные в переменную в функции, влияют на исходную переменную. Это может особенно запутать, когда вы передаете указатель, который уже является ссылкой на что-то еще. В случае, если ваша подпись функции выглядела так
void myFunc(myStruct *out);
Что произойдет, если вашей функции будет передана копия указателя для работы. Это означает, что указатель будет указывать на одну и ту же вещь, но будет другой переменной. Здесь любые изменения, сделанные в *out
(то есть на какие точки), будут постоянными, но изменения, внесенные в out
(сам указатель), будут применяться только внутри myFunc
. С такой подписью
void myFunc(myStruct *&out);
Вы заявляете, что функция будет принимать ссылку на исходный указатель. Теперь любые изменения, внесенные в переменную-указатель out
, будут влиять на исходный указатель, который был передан.
Как говорится, линия
out = new myStruct;
изменяет указатель переменной out
, а не *out
. На что бы out
ни указывал, он все еще жив и здоров, но теперь в куче создан новый экземпляр myStruct, и out
был изменен, чтобы указывать на него.