포인터와 자료형

포인터를 선언할 때 자료형 규칙

  • 포인터는 자신이 가리키는 메모리의 자료형과 일치하는 자료형으로 선언해야 한다.
1
2
3
4
5
int a = 10;
int *p = &a; // 원 자료형 int -> 포인터 자료형 int

float b = 20.0f;
float *q = &b; // 원 자료형 float -> 포인터 자료형 float
  • 만약 원래의 자료형과 포인터의 형을 다르게 할 경우, 경고가 발생한다.
1
2
3
4
int a = 10;
float *q = &a;
printf("%d", *q);
// 출력 : 0
1
warning: format specifies type 'int' but the argument has type 'float' [-Wformat]  

void 형 포인터

  • 자료형이 정해지지 않은 범용 포인터
  • 자료형에 관계 없이 어떤 변수든 가리킬 수 있다.
1
2
// 기본 문법
void *포인터변수명;
1
2
3
4
5
// 예시
int x;
float y;
void *p = &x; // int 형 변수를 가리키는 포인터
p = &y;       // float 형 변수를 가리키는 포인터

void 형 포인터를 참조하기

  • 단, 자료형이 없기 때문에 void 형 포인터를 직접 사용해 대상을 참조할 수 없다.
  • 참조 대상의 자료형에 맞게 포인터 형변환을 명시적으로 수행해야 한다.
1
2
3
int x = 10;
void *p = &x;
printf("%d", *p); // 에러 발생
1
불완전한 형식 "void"() 허용되지 않음  
  • 형변환을 명시적으로 수행하면 참조 가능
1
2
3
4
5
6
7
8
9
void void_pointer(){
  int a = 100;
  char b = 'b';
  void *p = NULL;
  p = &a;
  printf("*p = %d\n", *(int *)p);
  p = &b;
  printf("*p = %c\n", *(char *)p);
}
1
2
3
/ 출력
// *p = 100
// *p = b

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments