Еще одно использование указателей, которое я не вижу в других ответах, заключается в том, что это единственный из двух способов, которыми функция C может возвращать несколько значений.Функция AC определена так, чтобы возвращать один объект, но она может принимать много аргументов.Если ваша многозначная функция всегда возвращает один и тот же набор значений, вопрос удобства заключается в том, следует ли обернуть значения в структуру и сделать так, чтобы функция возвращала структуру, или чтобы функция получала указатели, через которые она может записывать значения.
Параметр указателя-параметра становится намного более привлекательным, если функции также необходимо возвращать код состояния или ошибки (потому что глупо записывать это через указатель, заставляя вызывающую функцию выделять другую переменную и препятствуя таким идиомам, какif(f()==ERROR)...
).И если набор значений непредсказуем во время компиляции (например, scanf, который должен интерпретировать строку формата во время выполнения), тогда указатели-параметры становятся единственной (разумной) опцией.
Редактировать: В вашем примере scanf("%s",&username);
, предполагая, что username является типом массива или указателем на хранилище, подходящее для хранения символьной строки, вам не нужно передавать адрес.Если это массив, он будет передаваться как указатель неявно.И если это уже указатель, взятие адреса дает указатель на указатель, который не подходит для хранения строки.Так что опустите &
здесь.