Подтвердить что ты не робот

Разница между char * и LPSTR в окнах

Извиняюсь, если это основной или глупый вопрос. В чем разница между char* и LPSTR. где sizeof оба дают 4 байта в моем компиляторе. Может кто-нибудь объяснить мне подробно. спасибо..

4b9b3361

Ответ 1

LPSTR - это тип Windows, который должен быть одинаковым независимо от того, на какой платформе вы компилировались. Это длинный указатель на строку.

В те дни сегментированной архитектуры (старые сегменты 64K, а не более новая селекторная сегментированная память), где у вас были маленькие, маленькие, средние, большие и огромные модели памяти, важно, чтобы тип Windows всегда был то же самое, независимо от типа указателя char *.

Итак, если вы выполнили разные компиляторы, в которых базовые типы были разными, заголовочный файл windows.h определял бы LPSTR, чтобы компенсировать это.

Например, Borland C может иметь шестнадцатиразрядный char * и LPSTR, возможно, для него должен был быть определен как far char *. В компиляторе, где char * уже был длинным/дальним указателем, LPSTR просто использовал бы это.

В настоящее время, с 32-битными плоскими моделями, вероятно, нет настоящих потребностей в таких махинациях, хотя это может случиться с такими вещами, как thunking между 64-битным и 32-битным кодом. Тем не менее, типы, определенные там, все еще с нами и все еще очень используются.

Ответ 2

В основном, указатели LP * должны указывать на использование 32-битного указателя на 16-битных версиях Windows:

От WikiBooks

Буквы "LP" или префикс "lp" означают "Long Pointer", который точно такая же, как обычный указатель на 32-битных машинах. LP данные объекты - это просто устаревшие объекты, перенесенные из Windows 3.1 или более поздней, когда нужно было разграничить указатели и длинные указатели. В современных 32-битных системах эти префиксы можно использовать взаимозаменяемо.

Ответ 3

Разница затухает в глубины времени. LPSTR означает "длинный указатель на строку". Назад перед 32-разрядными процессорами, указатели на память, которые могут находиться в другом сегменте памяти (думаю, далеко в памяти), нуждались в дополнительном пространстве для хранения.

В 32-разрядных (и более поздних) процессорах они точно такие же. Microsoft использует LPSTR исключительно по историческим причинам.