Почему 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 шт):
Потому что scanf принимает на вход после форматной строки указатели на переменные, которым нужно присвоить значение из потока ввода. Чтобы в функции значение присвоилось переменной и сохранилось, необходимо передавать указатель на нее, и тогда можно будет после разыменования присвоить значение переменной.
При присваивании же указатель разыменовывается, чтобы получить доступ к значению переменой по ее адресу, а потом уже идет присваивание нового значения
Звёздочка будет внутри функции scanf.
Представьте, что функция scanf доставляет посылку в какой-то дом. Номер дома записан в указателе p. Вы сообщили функции scanf номер дома, и поэтому она знает, куда доставить посылку (ввести значение). А если вы напишете scanf("%d", *p), то вы сообщаете этой функции не номер дома, а то, что в этом доме находится. Спрашивается - куда теперь мне эту посылку доставить?
А вот где-то в недрах функции scanf будет примерно такой код:
int a = /*число, введённое с клавиатуры*/
*p = a; /*Доставляем посылку по адресу p*/