포인터는 주소를 담을 때 사용하는 것이라 하였으니, 굳이 자료형을 선언할 필요가 없지 않을까? 라는 생각을 할 수 있다. 우선 결론적으로 말하자면, 사용할 수 있다. 하지만 제한이 따른다.
그림과 같이 void pointer에 다양한 자료형의 주소를 넣을 수 있다. 당연한 거지만 주소를 넣는 것이니 자료형에 구애를 받을 필요가 없다. 하지만 문제는 여기서 생긴다. 포인터 연산을 할 때 말이다.
우리가 int형 포인터 변수를 선언했다고 가정하자.(위의 코드처럼 말이다.) 그때 포인터 연산을 하여 +1을 더해줬다고 생각해보자. 그렇다면 주소에 4바이트를 더한 값이 나오게 된다.
하지만 void 포인터는 계산을 할 수가 없다. 이것이 void 포인터의 단점이다. 자료형이 무엇인지 모르니 포인터 연산을 할 수가 없다.
이와 같은 경우도 한번 보자. void 포인터로 선언할 경우인데, 자세히 보면 compile error가 난 것을 알 수 있다. 어떤 자료형인지 명시가 확실히 안되어 있으면, 이런 경우가 발생한다. 따라서 *
를 쓰고 싶으면 무조건 자료형을 써줘야 한다. 그럼 void pointer는 사용할 수 없는 것이냐? 라고 물으면 강제 형변환을 하면 된다.
바로 이 부분이다. 이런식으로 강제 형변환을 하여 사용하면 된다.
근데 왜 굳이 이렇게 쓰는가? 에 대한 질문을 한다면, 어떻게든 쓰인다곤 한다. 항상 그랬듯이 user마다 사용법이 다르기 때문에, 알아두는 것은 좋다.