C 언어 | 포인트 | 범용 포인터

임의 포인터를 저장할 수 있는 void 형 포인터를 소개한다. void 형 포인터는 함수를 통해 형식에 관계없이 포인터를 전달하고자 할 때 응용할 수 있다.

범용형

포인터를 받는 함수를 만들 때, 포인터의 형태를 특정하고 싶지 않은 경우가 있다. 예를 들어, 함수가 상태에 따라 다른 형태의 포인터를 받거나, 또는 반환하는 구조가 바람직한 경우이다.

예를 들어, 형식에 관계없이 특정 메모리 범위를 지정한 값으로 초기화하는 함수를 요청한 경우 어떻게 함수를 설계해야 할까? 하나의 방법으로는 char *형 포인터를 받고, 이에 지정된 값을 대입하는 방법을 생각할 수 있다. 그러나 함수의 이용자는 char * 이외의 경우는 함수를 호출할 때마다 포인터를 캐스팅해야한다.

특정 메모리 영역을 초기화하는 행위에 형태는 관계 없기 때문에 이 함수는 포인터 형에 관계없이 포인터를 받아야 한다. 이러한 경우 범용 포인터를 이용한다. 일반 포인터는 임의의 포인터를 대입할 수 있으며, 마찬가지로 형식 캐스팅에 의해 형태를 복원할 수 있다. 일반 포인터와 포인터의 형식에 void 키워드가 지정된 포인터이다.

void 형 포인터 선언

void * 변수명

void 형 포인터는 모든 형태의 포인터를 캐스팅하여 할당할 수 있다. 이를 이용하면 보다 확실하고 간단하게 형식에 관계없이 포인터를 받을 수 있다.

코드1

#include <stdio.h>

void FillMemory(void *mem , int size , char n) {
 int iCount;
 for(iCount = 0 ; iCount < size ; iCount++)
    *((char *)mem + iCount) = n;
}

int main() {
 unsigned int iCount , iArray[8];
  FillMemory(iArray , 4 * 8 ,0xFF);

 for(iCount = 0 ; iCount < 8 ; iCount++)
   printf("iArray[%d] = %X\n" , iCount , iArray[iCount]);

 return 0;
}

코드1의 FillMemory() 함수는 mem 초기화하는 영역에 대한 포인터를 size는 mem의 크기를 n은 초기화 값을 지정한다. main() 함수는 int 형의 배열 iArray[8]을 작성하고, 이를 FillMemory() 함수를 사용하여 0xFF로 초기화한다. 이 프로그램은 32비트 컴퓨터를 상정하고 있기 때문에, int 형은 4바이트, 배열은 8요소까지이기 때문에 iArray 배열 변수는 32바이트로 구성되어 있다. 따라서 FillMemory() 함수의 size 인수는 4 * 8을 지정한다.

이러한 형식에 관계없이 순수하게 메모리 주소를 전달하는 것이 목적 함수를 만드는 것은 드문 일이 아니다. 확장성이 뛰어난 시스템을 만들 때에는 실체를 추상화할 필요가 있기에 void 형 포인터를 적용할 수 있다.