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