글
(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(i=0; i<5*5; i++) { |
- 포인터를 이용해 배열의 값에 접근하려 했으나 결과를 보면 어드레스값이 출력 되었다.
- 결과를 보면 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() for(i=0; i<5; i++) for(i=0; i<5; i++) { } |
※ 참고자료 : 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 |
RECENT COMMENT