포인터란 주소(address)를 내용으로 가지는 변수(variable)이다.
포인터는 크게 두가지 요소로 구성되어 있다.
첫째, 내용으로 가지는 주소
둘째, 가리키는 주소에 저장되어 있는 데이터의 형(data type)이다.
이 두가지만 잘 생각하고 응용하면 조금 복잡할 찌라도 해결할 실마리를 줄것이다.
void 포인터란 포인터의 두 가지 요소중 둘재 요소인 가리키는 데이터형이 정해지지 않은 포인터를 의미한다. void 포인터의 정의는 가리키는 데이터형이 없으므로 데이형 자리에 void라는 예약어를 기술하면 된다.
1 | void *vptr; | cs |
void 포인터는 주소만 저장하는 포인터인데 그로 인해서 포인터 연상자를 사용할 때 주의해야 할 점이 있다.
첫째, 포인터가 가리키는 곳의 내용을 읽어내는 역참조(dereference, *) 연산자를 사용하지 못한다. 엄밀하게 이야기 하면 데이터형을 알 수 없기 때문이다. 그래서 형변환 연산자(casting operator)를 이요하여 다른 형의 포인터로 강제 형변환을 하면 참조가 가능하다.
1 2 3 4 5 | void* vptr; int i; i = *vptr; // 잘못된 표현 i = *(int*)vptr; // 형변환을 통한 void 포인터 사용법 | cs |
두번째, 가리키는 곳의 데이터형이 없으므로 +나 - 같은 포인터와 정수의 덧셈 뺄셈을 하지 못한다. 포인터에 정수를 더한다는 말은 포인터에다 "sizeof(가리키는 곳의 데어터형)*정수"를 하는 것이다. 하지만 void 포인터는 sizeof(가리키는 곳의 데이터형)을 구할 수가 없으므로 연산이 안되는 것이다. 그래도 참조와 마찬가지로 다른 형의 포인터로 강제 형변환하여서 +,- 연산을 행할 수 있다.
1 2 3 4 5 | void* vptr; int i; i = *(vptr + 1); // 잘못된 표현 i = *((int*)vptr + 1); // 형변환을 통한 void 포인터 사용법 | cs |
void 포인터는 형이 정해지지 않고, 또한 다른 형의 포인터로 강제 형변환하는 형태로 강제로 형을 부여할 수 있다. 이 성질을 이용하여 데이터형에 관계없이 동작하는 함수를 제작하는데 유용하게 사용할 수 있다. 예를등다면 stdlib.h에 정의되어 있는 qsort() 함수와 같은 것이다.
'C, C++' 카테고리의 다른 글
[c언어]값에 의한 호출 대 참조에 의한 호출 (call by value vs call by reference) (2) | 2016.01.26 |
---|---|
[C언어] 2차원 배열과 포인터 (0) | 2014.07.06 |
[C언어] 1차원 배열과 포인터 (0) | 2014.06.29 |
[C언어]포인터의 기초(pointer) (0) | 2014.06.26 |