«Представление» примерно означает, как вещи хранятся в памяти.Цитированная часть 6.2.5 § 28 предписывает, что определенные типы указателей должны храниться одинаковым образом.В том же абзаце предъявляются еще несколько требований к различным другим типам указателей.
Помимо перечисленных типов указателей, C дает некоторую свободу реализации для хранения указателей экзотическими и не обязательно совместимыми способами.Но на практике это ошибочно, так как я не думаю, что какие-либо реализации реального мира когда-либо делали это.Вместо этого системы с необходимостью разных представлений указателей, кажется, всегда изобретают нестандартные ключевые слова для квалификаторов указателей: far
и near
.
Приведенный выше код выводит 0, подразумевая, что представление объектаtest2 и test1 - это не одно и то же, 6.2.6 (p4)
Они указывают на разные переменные, поэтому, конечно, они не будут одинаковыми - указатели содержат разные значения независимо от представления.Чтобы проверить, является ли их представление объекта одинаковым, вы должны сделать следующее:
int i = 10;
char * test1 = (char *) &i;
void * test2 = &i;
printf("%d\n", test2 == test1); // prints 1
Или лучше: printf("%d\n", memcmp(test1, test2, sizeof test1));
.Который печатает 0 (равно).
ВОПРОС: Предполагает ли предложение, что указатель на void, преобразованный из указателя на тип символа, должен иметь те же требования к представлению и выравниванию, что и указатель натип символа, из которого он был преобразован?
Да, потому что это требуется согласно 6.2.5 §28.У нас также есть требование из главы преобразования указателей 6.3.2.3. §7:
Указатель на тип объекта может быть преобразован в указатель на другой тип объекта.Если результирующий указатель неправильно выровнен для ссылочного типа, поведение не определено.В противном случае при обратном преобразовании результат будет сравниваться равным исходному указателю.
Это также означает, что на практике все указатели объектов должны иметь один и тот же формат внутри, иначе вышеприведенное не было бывозможно.