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