ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20140318 (포인터, &, *, (int *) )
    부산IT학원/스마트컨트롤러 2014. 3. 18. 17:22

    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;

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

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

     

     

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.