강좌 & 팁
포인터 변수가 가리키는 자료형의 의미
포인터변수의 자료형은 포인터 변수가 가리키는 메모리의 크기를 나타낸다.
다음의 예제를 보자
#include <stdio.h>
int main()
{
int inum;
int *ip;
short *sp;
inum = 0x12345678;
ip = &inum;
printf("inum: %x, *ip: %p\n",inum, *ip);
sp = (short*)ip;
printf("inum: %p, *sp: %x\n",sp, *sp);
sp++;
printf("inum: %p, *sp: %x\n",sp, *sp);
return 0;
}
프로그램 설명
int *ip에서 ip는 int 형을 가리키는 포인트 변수이고, short *sp 의 sp는 short 형을 가리키는 포인트 변수 이다.
ip는 4바이트를 int형으로 계산하고, sp는 2바이트를 short형의 값으로 계산한다.
inum의 값이 0x12345678 로 초기화 되었고, ip는 inum의 주소값으로 초기화 되었다.
sp = (short*)ip;
short형 포인터 변수 sp가 ip의 주소값을 받는다. 이때 ip는 int형을 가리키고 있기 때문에 주소 값을 먼저 short 값을 가리키는 포인터로 캐스터 연산을 해주어야 한다. 캐스트 연산은 iip자체에는 아무런 영향을 주지 않고 sp에 부여하는 값을 short형 포인터로 바꾼다. 따라서 sp는 이 주소 값으로부터 2바이트를 short형의 데이터 값으로 해석한다. 실행결과에서 5678의 값이 나온 것을 볼 수 있다.
sp++;
포인터 변수 sp의 증가 연산은 sp의 값을 2증가시킨다. 포인터 주소의 연산은 자료형의 크기만큼 더해진다.
short형이 2바이트이므로 2증가이고 int형의 포인터인 경우 4가 증가된다. 결과적으로 sp는 inum의 나머지 2바이트의 값을 가리키게 된다.
출력 값이 역순으로 나온 것은 컴퓨터의 숫자 저장방식인 리틀 엔디안 이라는 방식 때문이다. 반대로 빅 엔디안 이라는 방식도 있다.