… разница в том, как память заложена для переменной-указателя на структуру,…
Нет, нет различий в том, как указатели на структуру представлены в памяти.Согласно C 2018 6.2.5 28:
Все указатели на типы конструкций должны иметь одинаковые требования к представлению и выравниванию друг с другом.
В этом отношении есть некоторые оговорки.Это не означает, что вы можете свободно конвертировать указатель на структуру одного типа и использовать его как указатель на структуру другого типа.Сноска говорит нам:
Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращаемых значений из функций и членов объединений.
По существуэто позволяет вам временно преобразовывать указатели в структуры туда-сюда - до тех пор, пока вы используете их для ссылки на элементы структуры, они были преобразованы обратно в исходный тип.По сути, любой указатель на структуру может быть временным держателем для любого другого указателя на структуру.
Есть несколько дополнительных вещей, которые вы можете сделать с указателем на структуру.Специальное правило гласит, что указатель на структуру, надлежащим образом преобразованный, указывает на ее первый член и наоборот (6.7.2.1 15).Таким образом, если первый член структуры также является структурой, это ситуация, в которой вы можете преобразовать указатель на один тип структуры в указатель на другой тип структуры и использовать его для доступа к членам.Однако это довольно редкое явление.
В целом, я ожидаю, что правило для всех указателей на структуры, имеющие одинаковые требования к представлению и выравниванию, состоит в том, чтобы заставить вещи работать, когда структура была объявлена (как в случае struct foo;
)., что делает его известным компилятору), но еще не определено (которое сообщает компилятору, что в нем).Мы хотим иметь возможность объявлять и определять указатели на структуры, когда все, что мы знаем о них до сих пор в исходном коде, это то, что они существуют, а не то, что в них.Если представление указателя на структуру варьируется в зависимости от того, что в ней находится, компилятор будет иметь разные представления о том, что указатель будет после простого объявления struct foo;
, чем тот, который будет иметь полное определение структуры.