Стал изучать указатели в Си и у меня появилось несколько вопросов по ним.
Приведу пример кода:
int a*;
printf("Address: %p\n", a);
printf("Value: %d\n", *a);
*a = 10;
printf("Updated value: %d\n", *a);
Output:
Address: 00400080
Value: 17744
После чего программа, не дойдя до последнего printf, завершается. Я надеюсь, что это не привело к порче стека, но тем не менее, почему программа завершилась? Вмешалась ОС? Но если так, то почему? Почему я не могу поменять значение самого указателя (ведь указатель - это всего лишь переменная, хранящая адрес значения, а не само значение).
Зато, если инициализировать указатель адресом переменной, то все работает:
int number = 123;
int a* = &number;
printf("Address: %p\n", a);
printf("Value: %d\n", *a);
*a = 10;
printf("Updated value: %d\n", *a);
Output:
Address: 0061FF18
Value: 123
Updated value: 10
Еще интересно: могу ли я указателю дать адрес на конкретную ячейку в памяти?
Из предыдущих примеров видно, что я получаю адрес значения. Изначально, вообще, я хотел сделать следующее: получить адрес в памяти и присвоить ему произвольное значение. После этого создать новую программу, где я хотел обратиться к известному мне адресу и затем посмотреть - сохранилось ли значение или нет.
Но если я напишу что-то по типу:
int *a = 0x0061FF18;
Output:
warning: initialization of 'int *' from 'int' makes pointer from integer without a cast
то очевидно получаю предупреждение, ведь вряд ли адрес памяти у указателя хранится в виде 16-ричного целочисленного литерала.
Так как можно обратиться (и можно ли вообще) к известному заранее участку памяти?