문제

나는 몇 가지 코드를 읽고있다 OGRE3D 구현과 나는 무엇을 이해할 수 없습니다 void * 변수 평균 유형. 포인터는 무엇을합니까 void C ++의 의미?

도움이 되었습니까?

해결책

공허에 대한 포인터, void* 모든 개체를 가리킬 수 있습니다.

int a = 5;
void *p = &a;

double b = 3.14;
p = &b;

당신은 당신이 어떤 유형을 가리키는 지 알지 못하기 때문에 해당 포인터를 피하거나 증가시킬 수 없습니다. 아이디어는 그 것입니다 void* 같은 기능에 사용할 수 있습니다 memcpy 메모리 블록을 복사하고 복사 한 유형에 신경 쓰지 않습니다.

다른 팁

유형을 모를 때 데이터를 전달하는 데 사용되는 일반적인 포인터 일뿐입니다. 사용하려면 올바른 유형으로 캐스트해야합니다.

메모리 스팟에 대한 원시 포인터입니다. char * 또는 int *와 같은 포인터 산술을 허용하지 않습니다.

사용법의 몇 가지 예입니다

http://theory.uwinnipeg.ca/programming/node87.html

포인터입니다 아무것 - 당신이 가지고 놀 수있는 메모리 덩어리 만- 대상 일 수 있습니다. 숯 일 수 있습니다. 당신은 그것에 유용한 일을하기 위해 캐스트해야합니다.

이전 게시물을 만들기 ...


주목: 여기의 모든 기억 주소는 허구입니다. 나는 단지 요점을 설명하기 위해 그들을 만들고 있습니다.


주어진:

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 ++의 클래스 멤버를 가리킬 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top