C를 공부하다 중간고지인 포인터를 익히기 되면 void형 포인터라는 복병을 만나게 된다.

void *vp;    //대상체의 타입을 명시하지 않는 특별한 포인터형 이다.


  1. 임의의 대상체를 가리킬 수 있다.
    1. 대상체가 정해져 있지 않다는 말은 어떠한 대상체도 가리키지 못한다는 뜻이 아니라 임의의 대상체를 가리킬 수 있다는 얘기와도 같다. 선언할 때 대상체의 타입을 명시하는 일반적인 포인터는 지정한 타입의 대상체만 가리킬 수 있지만 void형 포인터는 어떠한 대상체라도 가리킬 수 잇다.
      void형 포인터는 임의의 포인터를 대입 받을 수 있지만 반대로 임의의 포인터에 void형 포인터를 대입 할 때는 반드시 캐스팅을 해야 한다.
      pi = (int* )vp;    //int*pi
      pd=(double*)vp;    //double* pd

  2. *연산자를 쓸 수 없다.
    1. void형 포인터는 임의의 대상체에 대해 번지값 만을 저장하며 이 위치에 어떤 값이 들어 있는지는 알지 못한다. 따라서 *연산자로 이 포인터가 가리키는 메모리의 값을 읽을 수 없다. 대상체의 타입이 정해져 있지 않으므로 포인터가 가리키는 위치에서 몇 바이트를 읽어야 할지, 또 읽어낸 비트를 어떤 식으로 해석해야 할지를 모르기 때문이다. 만약 vp번지에 저장된 값이 정수형이라는 것을 확실히 알고 읽고 싶다면,

      *(int *)vp;        
      //vp를 잠시 정수형 포인터로 바꾼 후 번지의 정수값을 읽는다.

  3. 증감연산자를 쓸 수 없다.
    1. 대상체의 타입이 정해져 있지 않으므로 증감 연산자도 곧바로 사용할 수 없다.

      vp=(int *)vp + 1;    
      //vp를 잠시 int*로 캐스팅한 후 1을 더하면 4바이트를 더한다.

void형 포인터의 특징에 대해 간단하게 요약해 보면 대상체가 정해져 있지 않으므로 임의의 번지를 저장할 수 있지만 *연산자로 값을 읽거나 증감연산자로 이동할 때는 반드시 캐스트 연산자가 필요하다. 순수하게 메모리의 한 지점을 가리키는 기능만 가지는 포인터 이기 때문이다.

참고 : 이중포인터(winapi)

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다