(1) 2차원배열과 포인터
: 2차원 배열도 1차원 배열과 마찬가지로 포인터를 이용해서 접근 가능하다.

int arr[5][5];

- 만일 이렇게 이차원 배열을 선언한 경우 다음과 같이 추상화하여 사각형 테이블로 나타낼 수 있다.


- 하지만 메모리 어드레스는 1차원의 개념밖에 없습니다. 따라서 25개의 연속된 공간을 할당 한다. (int arr[25] 처럼)


- 따라서 1차원 배열과 마찬가지로 *(arr + 0) ~ *(arr + 24)로 각 원소에 접근할 수 있다.


(2) 포인터를 통한 2차원 배열의 잘못된 접근 예
: 2차배열은 'Array of Array' 입니다.


[CODE]
#include<stdio.h>

int
 main()
{
   int arr[5][5];
   int i, j;
   int count=1;

   for(i=0; i<5; i++)
      for(j=0; j<5; j++)
         arr[i][j] = count++;

   for(i=0; i<5*5; i++) {
      if((i %5)==0)
         printf("\n");
      printf("%d ", *(arr+i));
      
   }
}

[RESULT]
1244956  1244976  1244996  1245016  1245036
1245056  1245075   ....


- 포인터를 이용해 배열의 값에 접근하려 했으나 결과를 보면 어드레스값이 출력 되었다.
- 결과를 보면 20바이트씩 증가한 것을 볼 수 있다. (int 4바이트 * 5 = 20바이트)
- 따라서 arr + 1연산의 결과는 arr[0]에서 arr[1]로 넘어간 것으로, arr[1]은 arr[1][0]과는 다르는 것을 알 수 있다.
- arr[1]은 1차원배열과 마찬가지로 주소값을 가지지만, arr[1][0]은 저장된 값을 가진다.
- 결과적으로 arr[0][0]으로 접근하기 위해서는 *(arr[0]+0) 으로 수정하면 된다.

printf("%d ", *(arr+i)); ---> printf("%d ", *(arr[0]+i));

이해를 돕기 위해..

int arr[5][5];

arr -> 2차원 배열(주소값)
arr[0] -> 1차원 배열(주소값)
arr[0][0] -> 정수형 변수

- 1차원에서 배열 arr의 값 자체를 출력하면, 그 배열에 대한 어드레스 값이 나오듯이,
- 2차원에서 배열 arr[0]은 1차원 배열이므로, 이것의 값 역시 어드레스가 된다.


(3) 정리
: 2차 배열은 다른 의미로 보면 2중으로 연결된 포인터라고 볼 수 있다.
- arr[i][j]에 접근하기 위해서 2개의 어드레스를 거쳐갔기 때문이다.
- arr 자신의 어드레스 -> arr[i]의 어드레스 + j 번째

Array of Array 라는 건, 포인터 입장에서 보면 Pointer of Pointer가 된다.


(4) 2중포인터를 이용한 2차배열 접근
: 포인터 연산을 2중으로 처리함으로써 2차원 배열의 원소에 접근 할 수 있다.

arr[1][2]에 접근한다고 하면,

*(arr+1)  : 이렇게만 하면 arr[1][0]에 대한 어드레스만 얻을 수 있다.

*(*(arr+1) + 2)  : 이렇게 하면 arr[1][2]에 바로 접근할 수 있다.


[CODE]
#include<stdio.h>

int main()
{
    int arr[5][5];
    int i, j;
    int count=1;

    for(i=0; i<5; i++)
        for(j=0; j<5; j++)
            arr[i][j] = count++;

    for(i=0; i<5; i++) {
        for(j=0;j<5; j++)
        printf("%d\n", *(*(arr+i)+j));

    }
}

[RESULT]
1
2
3
4
5
6
...
25




※ 참고자료 : http://2xx195.tistory.com/7

'P rogramming > C Language' 카테고리의 다른 글

typedef - 자료형의 치환  (0) 2011.10.26
문자열과 포인터 이론  (2) 2011.10.26
1차원 배열과 포인터 이론  (0) 2011.10.26
포인터 이론  (0) 2011.10.26
2차원 배열의 연산  (0) 2011.10.25
by 민트앤라떼 2011. 10. 26. 11:43