Advertisement
RobertDeMilo

1 зачем нужен амперсанд в scanf

Jul 1st, 2025
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.45 KB | None | 0 0
  1. В C языке символ амперсанда (&) используется для получения адреса переменной, так как функция scanf ожидает указатели (адреса переменных), куда нужно записать считанные данные.
  2.  
  3. Первый случай:
  4. int n = 0;
  5. scanf("%d", &n);  // &n — передаём адрес переменной n
  6.  
  7. Здесь n — обычная переменная типа int, поэтому чтобы scanf мог записать в неё значение, нужно передать её адрес с помощью &.
  8.  
  9. Второй случай:
  10. int input(int* a, int* n) {
  11.     // ...
  12.     for (int* p = a; p - a < *n; p++) {
  13.         if (scanf("%d", p) != 1) {  // p — уже указатель, & не нужен
  14.             return 0;
  15.         }
  16.     }
  17.     // ...
  18. }
  19. Здесь p — это указатель (тип int*), который изначально указывает на начало массива a и перемещается по нему (p++).
  20. Поскольку p уже хранит адрес ячейки массива, передавать &p не нужно — это привело бы к передаче адреса самого указателя, а не элемента массива.
  21.  
  22. Почему во втором случае p не требует &?
  23. p объявлен как int* p = a, то есть это указатель на int.
  24.  
  25. При итерации p++ он перемещается на следующий элемент массива.
  26.  
  27.  
  28.  
  29. !!!!!!!!!!scanf("%d", p) записывает значение прямо в ту ячейку памяти, на которую указывает p.
  30.  
  31.  
  32.  
  33. Если бы мы написали scanf("%d", &p), то:
  34.  
  35. &p — это адрес самого указателя (тип int**), а не элемента массива.
  36.  
  37. Это привело бы к неопределённому поведению, так как scanf попытался бы записать int по адресу указателя, а не в сам массив.
  38.  
  39. Вывод:
  40. Если переменная обычная (не указатель) → нужен & для передачи адреса.
  41.  
  42. Если переменная уже является указателем → & не нужен, так как она и так хранит адрес.
  43.  
  44.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement