Почему функции C / ++ scanf нужны ссылочные переменные в качестве аргументов? - PullRequest
0 голосов
/ 06 мая 2020

Почему функции C / ++ scanf требуются ссылочные переменные в качестве аргументов? Мне было интересно, почему scanf не может просто принять саму переменную, поскольку он давал мне странное предупреждение всякий раз, когда я не вводил переменную, на которую указывает ссылка. Он думал, что я поставил указатель. Это почему? Спасибо.

Ответы [ 3 ]

2 голосов
/ 06 мая 2020

IIR C, функции scanf () взяты из C и требуют, чтобы их аргументы были указателями, потому что исходный C вообще не имел передачи по ссылке для параметров.

Программист, пишущий функцию, должен был использовать указатели (которые передавали значение адреса памяти) для достижения результата, который дал бы передача по ссылке.

Я научился программировать с помощью Pascal и этого (вместе с отсутствие проверки границ массива) было одной из самых раздражающих вещей в C, когда я впервые узнал об этом.

Я считаю, что C ++ имеет передачу по ссылке, но функции scanf взяты из C язык stdio, чтобы они передавали параметры по значению.

2 голосов
/ 06 мая 2020

Я не понимаю, как они могли изменить значение

Вот пример

#include <stdio.h> 

void changeNumber(int *n) {
  *n = 12;
}

int main() {  
  int x = 5; 
  printf("X: %i\n", x);
  changeNumber(&x);
  printf("X: %i", x);
  return 0; 
} 

Вывод

X: 5
X: 12
0 голосов
/ 06 мая 2020

Подумайте о разнице между двумя функциями scanf ниже:

#include <stdio.h>
void scanf_1(int a) {
    a = 5;
}

void scanf_2(int *a) {
    *a = 6;
}

int main()
{
    int b = 1;

    scanf_1(b);
    printf("(1) b = %d\n", b);
    scanf_2(&b);
    printf("(2) b = %d\n", b);

    return 0;
}

Результат:

(1) b = 1                                                                                                                                    
(2) b = 6

Вы можете увидеть, если вы передадите значение b не изменен. Но когда вы используете указатель и переходите по ссылке, значение b обновляется.

...