Почему scanf не нужна звёздочка рядом с указателем?

#include <stdio.h>

int main(){
    int x = 5;
    int *p;
    p = &x;
    *p = 10;
    printf("%d\n", x);
    scanf("%d", p);
    printf("%d\n", x);
}

Почему, если делать через присваивание, чтобы в x записать новое значение, указатель берется со звездочкой. Но если то же самое делать ввод, то звездочка уже не нужна. p же это адрес, а не значение переменной по этому адресу.


Ответы (2 шт):

Автор решения: rusgeli

Потому что scanf принимает на вход после форматной строки указатели на переменные, которым нужно присвоить значение из потока ввода. Чтобы в функции значение присвоилось переменной и сохранилось, необходимо передавать указатель на нее, и тогда можно будет после разыменования присвоить значение переменной.

При присваивании же указатель разыменовывается, чтобы получить доступ к значению переменой по ее адресу, а потом уже идет присваивание нового значения

→ Ссылка
Автор решения: maestro

Звёздочка будет внутри функции scanf.

Представьте, что функция scanf доставляет посылку в какой-то дом. Номер дома записан в указателе p. Вы сообщили функции scanf номер дома, и поэтому она знает, куда доставить посылку (ввести значение). А если вы напишете scanf("%d", *p), то вы сообщаете этой функции не номер дома, а то, что в этом доме находится. Спрашивается - куда теперь мне эту посылку доставить?

А вот где-то в недрах функции scanf будет примерно такой код:

int a = /*число, введённое с клавиатуры*/
*p = a; /*Доставляем посылку по адресу p*/
→ Ссылка