jam 블로그

[C] 18. 다차원 배열 그리고 포인터 본문

개발 및 관련 자료/C

[C] 18. 다차원 배열 그리고 포인터

kid1412 2013. 5. 12. 19:45
728x90

I. 2차원 배열 이름의 포인터 타입

  • 2차원 배열 이름이 가리키는 것은?

    • 1차원 배열이름과 마찬가지로 배열의 첫번째 요소를 가리키는 포인터 이다. 다음의 소스를 보자
  1.  #include <stdio.h>
  2. int main()
    {
     int a[3][2] = {1,2,3,4,5,6};
  3.  printf("a[0] : %d\n",a[0]);
     printf("a[1] : %d\n",a[1]);
     printf("a[2] : %d\n",a[2]);
  4.  printf("a : %d\n",a);
  5. printf("a[0][0] : %d\n",&a[0][0]);
     return 0;
    }
  • 위의 소스의 결과값을 보다 시피 a나 a[0]나 &a[0][0] 다 같은 주소값이 나온다.

 

  • 2차원 배열 이름 +1 : 배열 이름을 이용한 포인터 연산
  1. #include <stdio.h>
  2. int main()
    {
     int a[3][2] = {1,2,3,4,5,6};
  3.  printf("a : %d\n",a);
     printf("a+1 : %d\n",a+1);
     printf("a+2 : %d\n",a+2);
     printf("a[0] : %d\n",a[0]);
     printf("a[1] : %d\n",a[1]);
     printf("a[2] : %d\n",a[2]);
     return 0;
    }
  • 위에서 보면  a == a[0], a+1 == a[1], a+2 == a[2] 와 같은 결과가 나온다.

    • 즉 2차원배열 이름은 포인터 연산시 행 단위로 이동을 한다.는 것이다.

 

  •  포인터의 타입에는 이동에 대한 정보가 들어 있다.

    • 임의의 두 포인터 타입이 일치 한다면, 기본적으로 포인터 연산에 의해 증가 및 감소되는 값의 크기가 일치해야 한다고 결론 내릴수 있다.
  1.  #include <stdio.h>
  2. int main()
    {
     int a[3][2] = {1,2,3,4,5,6};
     int b[2][3] = {0,};
  3.  printf("a : %d\n",a);
     printf("a+1 : %d\n",a+1);
     printf("a+2 : %d\n",a+2);
     printf("b : %d\n",b);
     printf("b+1 : %d\n",b+1);
     printf("b+2 : %d\n",b+2);
     return 0;
    }
  • 위의 소스의 결과를 보다 시피 주소값들의 차이는 데이터형의 크기 * 열의 수 이다.

    • 따라서 2차원 배열 이름의 포인터 타입은 어떤 데이터형이자, 포인터 연산 시 배열요소를 몇칸씩 건너 뛰는 포인터 라는 것을 알수 있다.

 

  • 최종 결론! 배열 이름의 포인터 타입

    • 배열 포인터

      • int (*pArr)[4]와 *pArr[4] 차이점
      • int *pArr[4] 는 pArr[][4] 이런식으로 생각을 하면 편할 것이다.

 

  • 2차원 배열에서의 arr[i]와 *(arr+1)
  1. #include <stdio.h>
  2. int main()
    {
     int a[3][2]={0,};
  3.  printf("a[0] : %d\n",a[0]);
     printf("*(a+0) : %d\n",*(a+0));
  4.  printf("a[1] : %d\n",a[1]);
     printf("*(a+1) : %d\n",*(a+1));
  5.  printf("a[2] : %d\n",a[2]);
     printf("*(a+2) : %d\n",*(a+2));
  6.  printf("%d, %d\n",a[1][0],(*(a+1))[0]);
      return 0;
    }
  • 위와 같이 arr[i]와 *(arr+1)는 같은 거라는 것을 알 수 있다. 또 2차원 배열 같은 경우 a[1][0],(*(a+1))[0] 이런식으로 나타 낼수 있다.

문제

18 -1

문제 1

a와 a[0]가 같고 a+1과 a[1]이 가 같은 의미를 지니는 것으로 보인다. 실제로 가리키는 주소 값은 같지만 특성에 있어서는 다소 차이를 지닌다. 다음 예제를 직접 실행해 보고, 어떠한 특성적 차이가 있는지 결론을 내려보기 바란다.

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[3][2] = {1,2,3,4,5,6};
  5. printf("arr : %d\n,",sizeof(arr));
  6. printf("arr[0] : %d\n",sizeof(arr[0]));
  7. printf("arr[1] : %d\n",sizeof(arr[1]));
  8. printf("arr[2] : %d\n",sizeof(arr[2]));
  9. return 0;
  10. }

 

 18 -2

문제 1

다음 코드를 보고 빈칸에 들어갈 적절한 포인터 선언을 해보자

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int* arr1[5];
  5. int* arr2[3][5];
  6.                   = arr1;
  7.                   = arr2;
  8. return 0;
  9. }
Comments