20140318 (포인터, &, *, (int *) )

22일차

 

---------------

포   인   터

---------------

- 주소 값을 저장하는 변수. 기호는 * 로 쓴다.

지금까지 배운 * 기호의 역할이 4가지가 있는데

1. * : 곱셈

2. (type *) : 캐스팅

3. * : 주소를 따라가 그 곳에 저장된 값을 가리킴.

4. * : 포인터 변수 선언.

 

1번은 아는거고 2번에 대해서 우선 알아보자

먼저 전에 배웠던 & (Ampersand)를 변수 앞에 붙이면

그 변수의 주소값을 나타낸다고 배웠다.

2번, 3번을 보면 &과는 다른 값을 볼 수 있다.

다음 예제 소스를 보자

ex) 예제 소스

#include <stdio.h>

int main()
{
  int  iNum = 0;

//  &iNum  =  100;
//  주소상수  =  상수
//  --> Error!

//  0x12FF74 =  100;
//  16진상수    상수
//  --> Error!

//  (int *)0x12FF74 =  100;
//  주소상수    상수
//  --> Error!


  *( (int *)0x12FF74 ) = 100;
// 16진  주소를 가르키는 값     상수

  printf("iNum = %d \n", iNum);
  printf("&iNum = 0x%08X \n"&iNum);


  *( (int *)1245044 ) = 300;
// 10진  주소를 가르키는 값     상수

  printf("iNum = %d \n", iNum);
  printf("&iNum = %d \n"&iNum);



  *( &iNum ) = 1000;

  printf("iNum = %d \n", iNum);
  printf("&iNum = 0x%08X \n"&iNum);

  return 0;
}

출력 화면

 

위에 예제 소스를 보시다시피

(type *)메모리주소 가 그 해당하는 메모리주소를 나타내게 된다.

그 앞에다 * 을 붙이면 그 해당하는 메모리주소의 값을 지칭하게 된다.

밑에 예제 소스를 더 보자.

ex) 예제 소스

#include <stdio.h>

int main()
{
  int  iNum = 0;
  int  iCnt = 0;

  printf("iNum : %d \n", iNum);
  printf("&iNum : 0x%08X \n"&iNum);

  printf("iCnt : %d \n", iCnt);
  printf("&iCnt : 0x%08X \n"&iCnt);

  *((int*)0x12FF70) = 100;
  *((int*)0x12FF74) = 100;

  printf("\niNum : %d \n", iNum);
  printf("&iNum : 0x%08X \n"&iNum);

  printf("iCnt : %d \n", iCnt);
  printf("&iCnt : 0x%08X \n"&iCnt);


  return 0;
}

출력화면

 

 

이렇게 메모리 주소를 통하여 다른 메모리를 접근 할 수 있게 된다.

그런데 다른 메모리에 접근 할 때마다 번거로우니

4번이 필요하다

예제를 보자

ex) 예제 소스

#include <stdio.h>

int main()
{
  int  iNum = 0;
  int  iAddr = 0;
  int *  iP;

  printf("&iNum : 0x%08X \n"&iNum);
  printf("&iAddr : 0x%08X \n"&iAddr);

  iAddr = (int)(&iNum);

  printf("iAddr : %08X \n", iAddr);
  printf("iNum : %08X \n", iNum);
  
  *(int *)iAddr = 1000;

  printf("iNum : %d \n", iNum);

  iP = &iNum;

  *iP = 999;

  printf("iNum : %d \n", iNum);  

  return 0;
}

출력 화면

 

어쨋든 정리를 하자면

100                  int형 정수

iNum                int형 정수

&iNum              int *형 주소상수 (자신 주소값)

(int *)iNum        int *형 주소상수 (저장된 주소값)

ipNum               int *형 주소상수 (저장된 주소값)

*((int *)iNum)    iNum에 저장된 주소값을 따라가 그 안에 저장된 값.

*ipNum             iPNum에 저장된 주소값을 따라가 그 안에 저장된 값.

 

여기서 그냥 하는 얘기인데

*( (int *)0x0012FF74 ) = 100;

를 왜 쓰나 싶었는데, 어셈블리에서는

변수 대신 저렇게 주소값으로 쓴다고 한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

설정

트랙백

댓글