Open-Closed Principle

[c언어] void 포인터 본문

Programming/C, C++

[c언어] void 포인터

대박플머 2016. 1. 26. 01:13

포인터란 주소(address)를 내용으로 가지는 변수(variable)이다. 

포인터는 크게 두가지 요소로 구성되어 있다. 

첫째, 내용으로 가지는 주소

둘째, 가리키는 주소에 저장되어 있는 데이터의 형(data type)이다. 

이 두가지만 잘 생각하고 응용하면 조금 복잡할 찌라도 해결할 실마리를 줄것이다. 


void 포인터란 포인터의 두 가지 요소중 둘재 요소인 가리키는 데이터형이 정해지지 않은 포인터를 의미한다. void 포인터의 정의는 가리키는 데이터형이 없으므로 데이형 자리에 void라는 예약어를 기술하면 된다. 

1
void *vptr;
cs

void 포인터는 주소만 저장하는 포인터인데 그로 인해서 포인터 연상자를 사용할 때 주의해야 할 점이 있다. 

첫째, 포인터가 가리키는 곳의 내용을 읽어내는 역참조(dereference, *) 연산자를 사용하지 못한다. 엄밀하게 이야기 하면 데이터형을 알 수 없기 때문이다. 그래서 형변환 연산자(casting operator)를 이요하여 다른 형의 포인터로 강제 형변환을 하면 참조가 가능하다. 

1
2
3
4
5
void* vptr;
int i;
 
= *vptr; // 잘못된 표현
= *(int*)vptr; // 형변환을 통한 void 포인터 사용법
cs

두번째, 가리키는 곳의 데이터형이 없으므로 +나 - 같은 포인터와 정수의 덧셈 뺄셈을 하지 못한다. 포인터에 정수를 더한다는 말은 포인터에다 "sizeof(가리키는 곳의 데어터형)*정수"를 하는 것이다. 하지만 void 포인터는 sizeof(가리키는 곳의 데이터형)을 구할 수가 없으므로 연산이 안되는 것이다. 그래도 참조와 마찬가지로 다른 형의 포인터로 강제 형변환하여서 +,- 연산을 행할 수 있다. 

1
2
3
4
5
void* vptr;
int i;
 
= *(vptr + 1); // 잘못된 표현
= *((int*)vptr + 1); // 형변환을 통한 void 포인터 사용법
cs

void 포인터는 형이 정해지지 않고, 또한 다른 형의 포인터로 강제 형변환하는 형태로 강제로 형을 부여할 수 있다. 이 성질을 이용하여 데이터형에 관계없이 동작하는 함수를 제작하는데 유용하게 사용할 수 있다. 예를등다면 stdlib.h에 정의되어 있는 qsort() 함수와 같은 것이다.