ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20140331 (2차원 배열, 이중포인터, 배열포인터)
    부산IT학원/스마트컨트롤러 2014. 3. 31. 10:54

    31일차

     

     

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

    2차원 배열 메모리 구조

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

    -

    char Arr[3][3];

    int * ip = &Arr[0][0];

    2차원 배열이 실제 메모리에서는

     

    이런 식으로 저장되어 있다.

    그래서 아래와 같이 모두 같은 값을 가리킨다.

    ip[3] == Arr[0][3] == Arr[1][0]

     

     

     

    - 줄 이동 (주소값)

    Arr + 0    =    &Arr[0] + 0    =    &Arr[0]

    Arr + 1    =    &Arr[0] + 1    =    &Arr[1]

    Arr + 2    =    &Arr[0] + 2    =    &Arr[2]

     

    - 칸 이동 (주소값)

    &Arr[0][0]    =    Arr[0] + 0    =    *(Arr + 0) + 0    =    *( &Arr[0] + 0 ) + 0

    &Arr[0][1]    =    Arr[0] + 1    =    *(Arr + 0) + 1    =    *( &Arr[0] + 0 ) + 1

    &Arr[0][2]    =    Arr[0] + 2    =    *(Arr + 0) + 2    =    *( &Arr[0] + 0 ) + 2

     

    - 칸 이동 (값)

    Arr[0][0]    =    *(Arr[0] + 0)    =    *( *(Arr + 0) + 0 )    =    *( *( &Arr[0] + 0 ) + 0 )

    Arr[0][1]    =    *(Arr[0] + 1)    =    *( *(Arr + 0) + 1 )    =    *( *( &Arr[0] + 0 ) + 1 )

    Arr[0][2]    =    *(Arr[0] + 2)    =    *( *(Arr + 0) + 2 )    =    *( *( &Arr[0] + 0 ) + 2 )

     

     

     

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

    ---배열에서 []숫자 생략

    배열에서 []안에 숫자 생략이 가능한데 맨 왼쪽에 있는 숫자 하나만 가능하다.

    다만 초기화시에만 가능.

    int iaArr[ ] = {1, 2, 4, 5};

    int iaArr[ ][2] = {  {1, 2}, {3, 4}  };

    int iaArr[ ][2][2] = {  { {1, 2}, {3, 4} }, { {1, 2}, {3, 4} }  };

     

     

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

    ---포인터의 포인터

     

    int iNum = 3;                                      iNum -> 3

                                                         &iNum -> iNum주소

    int * ip = &iNum;                                     ip -> iNum주소

                                                             &ip -> ip주소

                                                              *ip -> 3

    int ** ipp = &ip;                                    ipp -> ip주소

                                                            &ipp -> ipp주소

                                                            *ipp -> iNum주소

                                                           **ipp -> 3

     

     

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

    ---배열 포인터, 포인터 배열

    int arr[3][4];                   //  배열

    int * ptr2[4];                    // 포인터 배열 , 이 변수 크기 16byte

    int (*ptr)[4];                    // 배열 포인터 (16byte씩 건너뛰는 포인터) , 이 변수 크기 4byte

     

    int (* ptr)[4];    // 포인터방식 선언

    int ptr[][4];      // 배열방식 선언

    둘 다 4byte 크기의 포인터로 연산시 16byte씩 이동하는 같은 뜻이다.

     

    ex) 예제 소스

    #include <stdio.h>

    void ShowArr2DStyle(int (*arr)[4]int column)
    {
      int  i;
      int  j;

      for(i = 0; column > i; ++i)
      {
        for(j = 04 > j; ++j)
        {
          printf("%d "arr[i][j] );
        }
        printf("\n");
      }
      printf("\n");
      printf("arr : %d \n"sizeof(arr) );
    }

    int Sum2DArr(int arr[][4]int column)
    {
      int  i;
      int  j;
      int  sum = 0;

      for(i = 0; column > i; ++i)
      {
        for(j = 04 > j; ++j)
        {
          sum = sum + arr[i][j];
        }
      }

      printf("arr : %d \n"sizeof(arr) );

      return sum;
    }

    int main()
    {
      int  arr1[2][4= {1,2,3,4,5,6,7,8};
      int  arr2[3][4= {1,1,1,1,3,3,3,3,5,5,5,5};

      ShowArr2DStyle(arr1, sizeof(arr1)/sizeof(arr1[0]) );
      ShowArr2DStyle(arr2, sizeof(arr2)/sizeof(arr2[0]) );

      printf("arr1의 합 : %d \n", Sum2DArr(arr1, sizeof(arr1)/sizeof(arr1[0]) ) );
      printf("arr2의 합 : %d \n", Sum2DArr(arr2, sizeof(arr2)/sizeof(arr2[0]) ) );

      return 0;
    }

    위의 예제처럼 이 차원 배열로도 사용할 수 있다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

Designed by Tistory.