Вам нужен ответ стандарта C или ответ, который работает почти всегда?
Обычно все указатели на данные имеют одинаковый размер, равный sizeof(void*)
.
Но так как вы пометили «C» и «стандарты», учтите, что это не требуется стандартом C. Я думаю, что это требуется для POSIX, а также для Win32, и ни в одной из современных современных архитектур нет инструкций, включающих указатели разного размера. Один сценарий, где у вас есть указатели разного размера, - это сегментированные архитектуры памяти с указателями «ближний» и «дальний», хотя, конечно, только один из них может быть «простым» указателем в C на любую данную реализацию. Другой сценарий заключается в том, что в теории указатель на int
может быть на 2 бита меньше, чем указатель на char
, если int всегда выровнен по 4. Если бы объем памяти был, скажем, 64 МБ, это могло бы означать, что int*
умещается в 2 байта, тогда как char*
или void*
требует 3. Так что стандарт C допускает разные размеры для разных типов, в данном случае sizeof(int*) < sizeof(char*)
.
Итак, и для ясности, и для гарантии правильности, если p
является указателем, то его размер равен sizeof p
.
Как сказал Стив Таунсенд в своем комментарии, вполне вероятно, что если вы зададите еще один вопрос о своем коде, вы сможете решить свою реальную проблему. Знание размера указателя не напрямую говорит вам о структуре структуры, содержащей указатель.