Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- В C языке символ амперсанда (&) используется для получения адреса переменной, так как функция scanf ожидает указатели (адреса переменных), куда нужно записать считанные данные.
- Первый случай:
- int n = 0;
- scanf("%d", &n); // &n — передаём адрес переменной n
- Здесь n — обычная переменная типа int, поэтому чтобы scanf мог записать в неё значение, нужно передать её адрес с помощью &.
- Второй случай:
- int input(int* a, int* n) {
- // ...
- for (int* p = a; p - a < *n; p++) {
- if (scanf("%d", p) != 1) { // p — уже указатель, & не нужен
- return 0;
- }
- }
- // ...
- }
- Здесь p — это указатель (тип int*), который изначально указывает на начало массива a и перемещается по нему (p++).
- Поскольку p уже хранит адрес ячейки массива, передавать &p не нужно — это привело бы к передаче адреса самого указателя, а не элемента массива.
- Почему во втором случае p не требует &?
- p объявлен как int* p = a, то есть это указатель на int.
- При итерации p++ он перемещается на следующий элемент массива.
- !!!!!!!!!!scanf("%d", p) записывает значение прямо в ту ячейку памяти, на которую указывает p.
- Если бы мы написали scanf("%d", &p), то:
- &p — это адрес самого указателя (тип int**), а не элемента массива.
- Это привело бы к неопределённому поведению, так как scanf попытался бы записать int по адресу указателя, а не в сам массив.
- Вывод:
- Если переменная обычная (не указатель) → нужен & для передачи адреса.
- Если переменная уже является указателем → & не нужен, так как она и так хранит адрес.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement