Visual Studio/C 기초

C언어 void형 포인터

낙락장송s 2013. 8. 17. 17:10

void형 포인터는 함수의 매개변수를 선언하는 경우에 가장 많이 사용됩니다. 가끔 여러가지 형태의 인수를 받아들일 수 있는 함수를 만들 필요가 있을 것이고, 어떤 경우에는 함수에 int형을 전달하고 다른 어떤 경우에는 float형을 전달할 수 있습니다. 함수가 void형 포인터를 인수로 받아들이도록 선언하면 한 가지 데이터 형만을 받아들이도록 제한되지 않습니다.

void pnt(void *x);

이렇게 선언을 하면 어떤 형태의 포인터도 인수로 전달하여 함수를 호출할 수 있습니다. 하지만 어떤 형태의 데이터를 가리킬지 모르는 상태에서 void형의 포인터를 전달할 수 있지만 포인터가 가리키는 변수의 값을 사용할 수는 없습니다. 그래서 형변환이 필요합니다.

(type *)x;

여기서 type은 상황에 맞는 데이터형입니다. 만약 int형이라면

(int *)x;

x가 가리키는 int형 값을 사용하기 위해서는

*(int *)x;

이러한 문장을 작성합니다.

간단한 예제를 하나 들겠습니다.

 

#include <stdio.h>

void pnt(void *x, char type);

main(){
 int i=20;
 long l=100000;
 float f=12.456;
 double d=123.044444;

 printf("%d\n",i);
 printf("%ld\n",l);
 printf("%f\n",f);
 printf("%lf\n\n",d);

 pnt(&i, 'i');
 pnt(&l, 'l');
 pnt(&f, 'f');
 pnt(&d, 'd');

 
 printf("%d\n",i);
 printf("%ld\n",l);
 printf("%f\n",f);
 printf("%lf\n",d);

}

void pnt(void *x, char type)  //형변환
{
 switch(type)
 {
 case 'i':
  {
   *((int*)x)/=2;
   break;
  }
 case 'l':
  {
   *((long*)x)/=2;
   break;
  }
 case 'f':
  {
   *((float*)x)/=2;
   break;
  }
 case 'd':
  {
   *((double*)x)/=2;
   break;
  }
 }