2014-05-09 2 views

답변

8

참조 "긴 포인터"(LP -types) :

곳 번이 long and short pointers했다 (사전 펜티엄). 그리고 그 시대에 WINAPI가 이미 있었고 오늘날에도 여전히 코드와 호환되도록 노력하기 때문에 LPsomething 유형이 생존했습니다. 포인터의 값을 보관 유지를 위해 충분히 넓은 정수의

: UINT_PTR를 참조

. 다음과 같은 C11-표준 같은 타입을 정의

1 다음 타입 특성과 부호 정수 타입을 지정 오브젝트 포인터를 유지할 수

7.20.1.4 정수형 그런 유효한 무효 포인터가이 형식으로 변환 가능하고, 무효화 포인터로 다시 변환 결과는 원래 포인터와 동일 비교 것이다

intptr_t 

다음 일반 E는 임의의 유효한 포인터가이 형식으로 변환 할 수있는 무효로하는 속성으로 부호없는 정수의 타입을 지정하고, 무효화 포인터로 다시 변환 결과는 원래 포인터와 동일 비교 것이다

uintptr_t 

이러한 유형은 선택 사항입니다.

+2

긴 포인터는 세그먼트 : 오프셋 메모리 주소 지정이있을 때 16 비트 일로부터옵니다. 긴 포인터 (일명 멀리 포인터)는 세그먼트와 오프셋을 모두 포함했습니다. 근거리 포인터는 세그먼트의 오프셋 만 포함합니다. 그것은 순수하게 Intel x86 아키텍처였습니다. –

5

UINT_PTR은 포인터 유형이 아닙니다. 포인터 값을 저장하기에 충분한 너비의 부호없는 정수 유형입니다 (따라서 너비는 대상 플랫폼에 따라 다릅니다). intunsigned int은 반드시 포인터를 보유 할만큼 충분히 넓지는 않기 때문에 존재합니다 (특히 int은 여전히 ​​32 비트이고 포인터는 64 비트 임).

+0

int가 32 비트 인 것은 x64에만 국한되지 않습니다. 플랫폼에 64 비트 정수 (LLP64 시스템)가 있더라도 32 비트는 여전히 길지만 CPU가 아니라 컴파일러/시스템에 따라 다릅니다. 예 : 동일한 플랫폼에서 Linux vs MS Windows. –