scanf("%d", grade);
должно быть scanf("%d", &grade);
Вы должны передать адрес переменной / буфера, где вы хотите сохранить элемент ввода.И grade
относится к содержимому, там оператор &
addressof, работающий на grade
&grade
, дает нам адрес переменной.
В случае scanf("%s", student);
student
сам относится к адресу, то есть к содержимому переменной-указателя student
, которая содержит базовый адрес блока памяти, который вы только что выделили.Поэтому это правильно.
Аргументы всегда должны указывать на адрес расположения переменной / буфера, куда вы хотите, чтобы scanf
поместил этот конкретный раздел этого ввода.
Скажем, изначально у вас есть мусор 0x5964
, хранящийся в grade
, а адрес памяти grade
равен 0x1234abcd
.В scanf ("%d", grade);
, scanf
будет пытаться записать чтение в целое число в ячейку памяти 0x5964
, что недопустимо.
В то время как в scanf ("%d", &grade);
, scanf
будет хранить чтение в целое число вячейка памяти 0x1234abcd
.После этого, ссылаясь на grade
как r-значение, вы получите содержимое в ячейке памяти 0x1234abcd
, это то, что вам нужно.
+----------+
| 0x5964 | <-------(uses this as address)---+-------------------+
+----------+ <------+ | |
| grade | (writes) scanf ("%d", grade); |
+----------+ (here) scanf ("%d", &grade); |
|0x1234abcd| | | |
+----------+ <------+(uses this as address)---+ |
|
|
+----------+ |
| ?????? | <----------(tries to write here)----------------------+
+----------+
| ??? |
+----------+
| 0x5964 |
+----------+