Подробности реализации указателя в C
я бы хотел знатьархитектуры, которые нарушают предположения Я перечислил ниже. Кроме того, я хотел бы знать, является ли какое-либо из предположений ложным для всех архитектур (то есть, если какое-либо из них просто совершенно неверно).
sizeof (int *) == sizeof (char *) == sizeof (void *) == sizeof (func_ptr *)
Представление в памяти всех указателей для данной архитектуры одинаково независимо от типа данных, на который указывает.
Представление указателя в памяти такое же, как целое число той же длины в битах, что и архитектура.
Умножение и деление типов данных указателя запрещено только компилятором. ПРИМЕЧАНИЕ: Да, я знаю, что это бессмысленно. Что я имею в виду - есть ли аппаратная поддержка, чтобы запретить это неправильное использование?
Все значения указателя могут быть преобразованы в одно целое число. Другими словами, какие архитектуры все еще используют сегменты и смещения?
Увеличение указателя эквивалентно добавлениюsizeof(the pointed data type)
на адрес памяти, сохраненный указателем. Еслиp
являетсяint32*
тогдаp+1
равен адресу памяти через 4 байтаp
.
Я больше всего привык к тому, что указатели используются в непрерывном виртуальном пространстве памяти. Для такого использования я обычно могу считать их адресами в числовой строке. Смотрите вопрос переполнения стекаСравнение указателей.