POST

C언어 형(Type)이 존재하지 않는 void 포인터

void * ptr; 이것을 가리켜 void형 포인터 변수라 한다.


void형 포인터 변수는 무엇이든 담을 수 있는 바구니에 비유할 수 있다. void현 포인터 변수에는 어떠한 변수의 주소 값이든 잠을 수 있다. 하다못해 함수의 주소 값도 담을 수 있다.

아래의 예제를 살펴보자.

#include<stdio.h>


void SoSimpleFunc(void) {

printf("I'm so simple");

}


int main(void) {

int num =20;

void *ptr;


ptr = &num; // 변수 num의 주소 값 저장

printf("%p \n", ptr);


ptr = SoSimpleFunc; // 함수SoSimpleFunc의 주소 값 저장

printf("%p\n", ptr);

return 0;

}



위의 예제에서 보이듯이 무엇이든 담을 수 있으니 좋게만 느껴 질수도있다. 하지만 단점도 있다.

void형 포인터 변수를 가지고는 아무런 포인터 연산을 하지 못한다. 값의 변경이나 참조도 불가능 하다. void형 포인터 변수에는 가리키는 대상에대한 어떠한 형(Type) 정보도 담겨있지 않으므로 이는 당연한 것이다. 따라서 아래의 코드를 실행하면 오류가 난다.

int main(void) {

int num = 20;

void * ptr = &num;

*ptr = 20; // 컴파일 에러

ptr++; // 컴파일 에러

 . . .

}

그래서 이러한 void형 포인터 변수는 "일단 주소값에만 의미를 두고, 포인터의 형은 나중에 결정"할때 사용을 하게되며, '메모리의 동적 할당'과 매우 깊은 관계가있다.