블로그 이미지
송시혁

calendar

1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

Notice

Tag

Recent Post

Recent Comment

Recent Trackback

Archive

#include <stdio.h>
int main()
{
  int inum;
  int *ip;
  short *sp;
  
  inum = 0x0F5A0B43;
  ip =&inum;
  printf("inum: %x *ip : 08%x\n", inum, *ip);

  sp = (short*)ip;
  printf("sp : %08x, *sp : %x\n", sp, *sp);
  
  sp = sp +1;
  printf("sp : %p, *sp : %x\n", sp, *sp);

  printf("*ip = %08x\n", *ip);
  printf("*sp = %04x\n", *sp);

  return 0;
}

이번에는 예제를 통해 변수가 가르키는 의미를 알아본다.

처음 printf문은 그대로 0F5A0B43가 나온다. 다음문에 나오는 sp를 주목한다.

sp에 short형으로 포인트를 선언했다. 정확히 말하면 포인트 변수인 *ip를 강제로

short형 포인트로 선언했다.

sp = (short*)ip; -> short형 캐스트 연산자.

이렇게 2byte형으로 변환한 다음 출력한다. 그랬더니 0012ff70, b43이 나왔다.

0012ff70은 ip가 가지고 있던 inum의 주소값에서 2byte크기의 주소값을 출력한것이다.

*sp는 ip의 값 0F5A0B43를 2byte형으로 나타내었다. b43이 출력이 된것은

컴퓨터의 저장방식은 화면출력과 반대로 되어있는것과 관련이 있다.

43 0B 5A 0F로 저장되어 있다. 이중에서 2byte인 43 B0만 출력한다.(short)

그래서 화면상에 0B43이 되어 B43이 출력된다.

 

sp = sp +1;을 잘보자.

 sp = sp +1;
  printf("sp : %p, *sp : %x\n", sp, *sp);

  printf("*ip = %08x\n", *ip);
  printf("*sp = %04x\n", *sp);

포인터에서 증감식 1은 단순히 숫자를 1더하는 것이 아니다.

그 자료형의 크기를 저장한다.

지금 sp는 short형 포인터 변수이다. 그래서 2byte가 되는데

 1을 더하면 2byte 만늠 이동하게 된다. 

 
원래 ip의 inum값은 4byte이다. 그러나 sp를 ip의 값을 따라가서 2byte의

 값을 가진다. 그런데 거기에서 +1만큼 이동, 2byte만큼 이동한다.

ip의 inum의 값.(*ip)

 

43

0B

5A

0F

 sp = (short *)ip;의 값

 43

 0B

sp = sp +1;의 값.

 5A

 0F

 

43 0B 5A 0F에서 43 0B의 값을 가지다가 2칸 이동하여 5A 0F가 된다. 만약에 +2를 한다면 4칸만큼 이동할것이다. short는 크기가 2byte이기 때문이다.

그래서  printf("sp : %p, *sp : %x\n", sp, *sp);는

sp = 0012FF72(F5A의 주소값), *sp = F5A가 출력된다.

 

posted by 송시혁