your programing

C ++에서 void 포인터는 무엇입니까?

lovepro 2020. 10. 16. 07:55
반응형

C ++에서 void 포인터는 무엇입니까?


중복 가능성 :
void 포인터는 무엇이며 null 포인터는 무엇입니까?

나는 종종 다음과 같은 코드를 봅니다.

void * foo(int bar);

이것은 무엇을 의미 하는가? 무엇이든 반환 할 수 있다는 의미 입니까? 이 유사하다 dynamic또는 objectC #에서?


A void*는 아무 의미가 없습니다. 포인터이지만 가리키는 유형을 알 수 없습니다.

"아무것도"를 반환 할 수있는 것이 아닙니다. void*일반적으로 를 반환하는 함수 는 다음 중 하나를 수행합니다.

  • 포맷되지 않은 메모리를 처리하고 있습니다. 이것이 무엇 operator new이며 malloc반환 : 특정 크기의 메모리 블록에 대한 포인터. 메모리에는 유형이 없기 때문에 (아직 제대로 구성된 객체가 없기 때문에) 유형이 없습니다. IE : void.
  • 불투명 핸들입니다. 특정 유형의 이름을 지정하지 않고 생성 된 객체를 참조합니다. 이를 수행하는 코드는 일반적으로 형식이 잘못되었습니다. struct / class를 앞으로 선언하고 단순히 공개 정의를 제공하지 않는 것이 더 낫기 때문입니다. 그렇다면 적어도 실제 유형이 있기 때문입니다.
  • 알려진 유형의 개체를 포함하는 저장소에 대한 포인터를 반환합니다. 그러나 해당 API는 다양한 유형의 객체를 처리하는 데 사용되므로 특정 호출이 반환하는 정확한 유형은 컴파일 타임에 알 수 없습니다. 따라서 어떤 종류의 객체를 저장할 때 어떤 유형으로 안전하게 캐스팅 할 수 있는지 설명하는 문서가 있습니다.

이 구조는 없다 아무것도 같은 dynamic또는 objectC #을한다. 이러한 도구는 실제로 원래 유형이 무엇인지 알고 있습니다. void* 하지 않습니다 . 이것은 그 어떤 것보다 훨씬 더 위험합니다. 왜냐하면 그것을 잘못 이해하는 것은 매우 쉽기 때문입니다. 그리고 특정한 사용법이 올바른 것인지 물어볼 방법이 없기 때문입니다.

그리고 개인적인 메모에서 void*'s' 를 사용하는 코드를 본다면 어떤 코드를보고 있는지 다시 생각 해봐야합니다. void*사용, 특히 C ++에서 드문해야 원시 메모리를 처리하는 주 사용.


Void는 키워드로 사용됩니다. 제네릭 포인터라고도 하는 void 포인터는 모든 데이터 유형의 객체를 가리킬 수있는 특수 유형의 포인터입니다! void 포인터는 포인터의 유형으로 void 키워드를 사용하여 일반 포인터처럼 선언됩니다.

일반 구문 :

void* pointer_variable;

void *pVoid; // pVoid is a void pointer

void 포인터는 모든 데이터 유형의 객체를 가리킬 수 있습니다.

int nValue;
float fValue;

struct Something
{
    int nValue;
    float fValue;
};

Something sValue;

void *pVoid;
pVoid = &nValue; // valid
pVoid = &fValue; // valid
pVoid = &sValue; // valid

그러나 void 포인터는 자신이 가리키는 객체의 유형을 모르기 때문에 역 참조 할 수 없습니다! 오히려 void 포인터는 역 참조되기 전에 먼저 명시 적으로 다른 포인터 유형으로 캐스팅되어야합니다.

int nValue = 5;
void *pVoid = &nValue;

// can not dereference pVoid because it is a void pointer

int *pInt = static_cast<int*>(pVoid); // cast from void* to int*

cout << *pInt << endl; // can dereference pInt

Source: link


A void* pointer is used when you want to indicate a pointer to a hunk of memory without specifying the type. C's malloc returns such a pointer, expecting you to cast it to a particular type immediately. It really isn't useful until you cast it to another pointer type. You're expected to know which type to cast it to, the compiler has no reflection capability to know what the underlying type should be.


A void* can point to anything (it's a raw pointer without any type info).

참고URL : https://stackoverflow.com/questions/8530080/what-is-a-void-pointer-in-c

반응형