본문으로 바로가기

void 포인터와 형변환

category 프로그래밍/C언어 2018. 6. 14. 22:37

오늘은 void 포인터와 형변환에 관한 포스팅을 하겠습니다.

변수는 선언하기 위해서는 변수의 이름과 자료형이 필요합니다.
여기서 void라는 것은 '자료형이 없다'는 의미입니다.
그렇기 때문에 변수를 만들수 없습니다.

하지만 void 포인터는 다릅니다!!
포인터 변수는 주소를 저장하는 변수입니다.

형태 :  자료형 *변수이름 ; 




void 포인터 가지는 의미는 자료형이 결정되지 않은 주소를 저장하는 포인터라 할수있습니다.
아래의 예제를 보겠습니다.

#include <stdio.h> int main() { void *n; int a = 1; char b = 'a'; n = &a; n = &b; return 0; }

보시는 것처럼 void 포인터 n은 int 형 , char 형 상관없이 모든 주소를 받을수 있습니다.
그렇다면 *n 을 printf() 하게 되면 a,b의 데이터를 출력해야 하는데 아래를 보시는것 처럼 안됩니다.

#include <stdio.h> int main() { void *n; int a = 1; int b = 'a'; n = &a; printf("%d\n", *n); n = &b; printf("%c\n", *n); return 0; }

<출력결과>

참조가 잘못되었다고 에러가 납니다.
왜 그럴까요? 주소를 저장은 했지만 어떤 데이터가 메모리 공간에 저장돼 있는지 
컴파일러는 알 방법이 없습니다.
그렇기 때문에 형변환을 해야지만 제대로 사용할수 있습니다.
그럼 수정해보겠습니다.

#include <stdio.h> int main() { void *n; int a = 1; int b = 'a'; n = &a; printf("%d\n", *(int*)n); n = &b; printf("%c\n", *(char*)n); return 0; }

<출력결과>

보시는 것처럼 출력결과는 1,10 이 됩니다.

*(int *)n; 의 의미는
n을 int * 형으로 만들겠다. 즉 , n을 int 형 포인터로 형변환을 시키겠다는 의미입니다.