Хотя это очень просто c и может показаться глупым, я пытаюсь понять, в чем разница между int *ptr = 45
или 0xc8750;
(некоторым числом) против int *ptr= &a;
(адрес переменной) .
То, что я уже знаю:
- Указатели предназначены для хранения адресов переменных и для изменения содержимого точечные переменные (но я хочу знать, как это будет достигнуто)
- В последнем случае я могу присвоить
*ptr
другому законному адресу. - Но в первом случае это Недопустимо!.
Почему последнее недопустимо, если оба адреса / числа являются целыми числами? Как по-разному они будут обрабатываться при хранении в памяти?
У меня есть два кода / программы, в основном, чтобы выделить одно и то же:
case-1:
#include <stdio.h>
int main()
{
int *ptr = 0xc42; // is this stored in read only memory?!! which later leads to seg faults in further assignments?!
*ptr = 45; //illegal leads seg fault.
return 0;
}
case-2:
int main()
{
int a=10, b=20;
int *ptr = &a; // is here get any special treatment and object will be created for *ptr!!!
*ptr = &b; //legal
printf(" *ptr = %d \n", *ptr);
*ptr = 20; //legal !!
printf(" *ptr = %d \n", *ptr);
*ptr = 50; //legal
printf(" *ptr = %d \n", *ptr);
return 0;
}
Как мы видим, *ptr = 20
и *ptr = 50
являются законными и штрафными! (Нет ошибок сегментации).
Почему это назначение int *ptr = 0xc989
или 5 отличается от int *ptr = &variable
?.