int a = 1;
...
int *pt = a;
Пытается сохранить значение 1
в качестве адреса , удерживаемого указателем pt
.Любое разыменование pt
гарантировано для SegFault, поскольку address 1
находится в самом низу диапазона зарезервированной системы памяти, к которому у вас нет возможности доступа, что приводит к нарушению доступа и SegFault.
Что такое указатель?
Указатель - это просто обычная переменная, которая содержит адрес чего-то еще в качестве значения.Другими словами, указатель указывает на адрес, где можно найти что-то еще.Если вы обычно думаете о переменной, содержащей непосредственные значения, такие как int a = 5;
, указатель будет просто содержать адрес, где 5
хранится в памяти, например, int *b = &a;
.Он работает одинаково независимо от типа объекта, на который указывает указатель.Он может работать таким образом, потому что type
указателя управляет арифметикой указателя, например, с указателем char *
, указателем pointer+1
на следующий байт для указателя int *
(обычное 4-байтовое целое число), pointer+1
будет указывать на следующее int
со смещением на 4 байта после pointer
.(так что указатель, это просто указатель .... где арифметика автоматически обрабатывается type
)
Так что в вашем случае:
int a = 1;
...
int *pt = &a;
Назначит адрес, где a
сохраняется в памяти для переменной указателя pt
.Затем вы можете получить доступ к значению по этому адресу, разыменовав pt
(например, *pt
)