C ++의 공허에 대한 포인터?
-
03-07-2019 - |
문제
나는 몇 가지 코드를 읽고있다 OGRE3D 구현과 나는 무엇을 이해할 수 없습니다 void *
변수 평균 유형. 포인터는 무엇을합니까 void
C ++의 의미?
해결책
공허에 대한 포인터, void*
모든 개체를 가리킬 수 있습니다.
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
당신은 당신이 어떤 유형을 가리키는 지 알지 못하기 때문에 해당 포인터를 피하거나 증가시킬 수 없습니다. 아이디어는 그 것입니다 void*
같은 기능에 사용할 수 있습니다 memcpy
메모리 블록을 복사하고 복사 한 유형에 신경 쓰지 않습니다.
다른 팁
유형을 모를 때 데이터를 전달하는 데 사용되는 일반적인 포인터 일뿐입니다. 사용하려면 올바른 유형으로 캐스트해야합니다.
메모리 스팟에 대한 원시 포인터입니다. char * 또는 int *와 같은 포인터 산술을 허용하지 않습니다.
사용법의 몇 가지 예입니다
포인터입니다 아무것 - 당신이 가지고 놀 수있는 메모리 덩어리 만- 대상 일 수 있습니다. 숯 일 수 있습니다. 당신은 그것에 유용한 일을하기 위해 캐스트해야합니다.
주목: 여기의 모든 기억 주소는 허구입니다. 나는 단지 요점을 설명하기 위해 그들을 만들고 있습니다.
주어진:
int data[] = {10,11,12};
우리는 지금 가지고 있습니다 :
0xffff0000-0xffff0003 with a value of (int)(10)
0xffff0004-0xffff0007 with a value of (int)(11)
0xffff0008-0xffff000b with a value of (int)(12)
(나는 ~ 아니다 여기에서 빅 엔디 언 vs 리틀 엔디 언트 바이트 주문에 들어갑니다.)
우리가 가지고 있다면 :
int * p = data;
이제 다른 메모리 위치가 있습니다.
0xaaaa0000-0xaaaa0003 with a value of (int*)0xffff0000
우리는 사용할 수 있습니다 P [1 또는 *(p + 1)]을 참조하려면 *(int *) (0xffff0004) [= 11]을 sizeof (int) = 4 및 0xffff0000 + sizeof (int) = 0xffffff000으로 참조하십시오.
우리가 가지고 있다면 :
void * v = data;
이제 다른 메모리 위치가 있습니다.
0xbbbb0000-0xbbbb0003 with a value of (void*)0xffff0000.
그러나 void에는 () 정보의 관련 크기가 없습니다. 포인터를 증가 시키거나 줄일 수 없습니다. 0xFFFF0000에 저장된 데이터에 액세스 할 수는 없습니다. 우리는 값을 원시 메모리 주소로만 활용할 수 있습니다.
(void*) 0xffff0000에 저장된 데이터를 사용하려면 먼저 적절한 유형으로 캐스팅해야합니다.
즉, (void *)는 주소를 임의의 데이터 구조로 전달하는 수단으로 여전히 매우 유용합니다. 예를 들어, memset (). 내가 Zero'ing a 구조 TM 또는 a struct sockaddr. 구조물과 크기에 대한 포인터가 필요합니다.
(이것은 말할 필요도 없지만 ... Memset을 사용하여 클래스 인스턴스를 제로화하고, 그렇게하면 가상 포인터 테이블을 덮어 씁니다.)
공허 포인터는 C ++의 클래스 멤버를 가리킬 수 없습니다.