자료실/C언어

C언어 - void 포인터

자료수집중 2020. 7. 3.
반응형

 

지금까지의 모든 포인터는 선언할 때 자료형이 어떤 건지 명시했었습니다.

이번에는  정해놓고 선언하는 포인터가 아닌 그냥 메모리 주소만 선언하는 포인터에 대해 알아보겠습니다.

 

 

포인트의 자료형에 void가 들어가게 되면 포인터는 단순히 메모리 주소만 선언된 변수가 됩니다.

void *변수이름;

void 포인터는 어떤 자료형이든 변할 수 있습니다.

#include <stdio.h>

int main(void) {

	int num = 50;
	char cha[] = "Hello world";
	int *pnum = &num;

	void *p_val= &num;

	void *p_val2;
	p_val2 = &num;
	
	//printf("%d \n", *p_val);  //애러발생
	//printf("%d \n", *p_val2);
	//printf("%s \n", *p_val2);
    
	return 0;
}

선언과 동시에 대입도 가능하고 중간에 포인터에서 포인터도 저장이 가능합니다.

대신 단점은 일반적인 방법으로는 역참조가 불가능합니다. 왜냐하면 void는 자료형이 정해져 있지 않기 때문입니다.

그래서 일반 포인터랑 조금 다르게 역참조를 합니다.

바로 자료형 포인터를 지정해서 하면 됩니다.

#include <stdio.h>

int main(void) {

	int num = 50;
	char cha[] = "Hello world";
	int *pnum = &num;

	void *p_val= &num;

	void *p_val2;
	p_val2 = &num;

	void *p_val3;
	p_val3 = cha;


	printf("%d \n", *(int *)p_val);  
	printf("%d \n", *(int *)p_val2);
	printf("%s \n", (char*)p_val3);
	return 0;
}

자료형을 지정해주기 때문에 void의 애러가 사라지게 됩니다. 당연히 저장한 자료형과 다르면 엉뚱한 값이 발생합니다. (문자열은 문자열 자체가 저장 방식이 포인터 형식과 같아서 자료형 지정이 조금 다릅니다.)

 

 

void 포인터는 매개변수로도 사용이 가능합니다.

#include <stdio.h>

void fun_1(void *pval1) {

}
int main(void) {

	int num = 1;
	float fnum = 10.0;
	fun_1(&num);
	fun_1(&fnum);
	
	return 0;
}

매개변수에 정해진 자료형이 없기 때문에 모든 자료형의 변수를 받을 수 있게 됩니다.

단 매개변수라 해도 void형은 역참조를 할 수 없기 때문에 열거형이나 매크로 등으로 자료형의 데이터까지 같이 보내주는 게 좋습니다.

 

 

 

'자료실 > C언어' 카테고리의 다른 글

C언어 - 내장 매크로  (0) 2020.07.21
C언어 - #define  (0) 2020.07.04
C언어 - 포인터와 다중 포인터  (0) 2020.07.03
C언어 - typedef  (0) 2020.07.02
C언어 - 열거형  (0) 2020.07.02

댓글