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

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. }

이 글은 스프링노트에서 작성되었습니다.

'2. C/C++ > 01. C' 카테고리의 다른 글

21. 문자와 문자열 처리 함수  (0) 2008.12.07
19. 함수포인터와 void 포인터  (0) 2008.12.07
17. 포인터의 포인터  (0) 2008.12.07
16. 다차원 배열  (0) 2008.12.07
14. 포인터와 함수에 대한 이해  (0) 2008.12.07
Posted by kid1412
,