다차원 배열과 포인터의 관계
- 2차원 배열과 포인터의 잘못된 오해
정수형 2차원 배열의 배열 이름은 정수형 더블 포인터 형이라고 오해하고 2차원 배열의 이름을 매개 변수 혹은 변수로 주소 값을 받을 때 더블 포인터 변수로 받을 수 있다.
<2차원 배열과 포인터의 잘못된 관계>
더블 포인터로 받을 수 있는 것은 포인터 배열의 이름이다.
- 2차원 배열의 배열 이름의 포인터 형은?
먼저, 알아야 할 것은 arr과 arr[0]의 차이를 알아야 한다.
arr과 arr[0]은 2차원 배열의 첫 시작 주소를 가리키지만 차이점이 존재한다. sizeof 연산자를 이용하여 11번째 라인, 12번째 라인처럼 사이즈를 체크했을 때 arr은 배열의 전체 길이를 나타냈지만, arr[0]의 경우는 해당 행의 길이를 반환하였다.
그리고 다음으로는 배열 이름을 이용하여 포인터 연산을 행했을 때 어떤 연산 결과가 나타나는지 알아야한다.
2차원 배열 이름에 +1, +2 포인터 연산을 진행하였을 때 각 주소는 8씩 증가하는 것을 볼 수 있다.
이번에는 2차원 배열의 열에 해당하는 인덱스를 2에서 4로 변경한 후 포인터 연산을 진행했는데, 이 때 주소의 증가 폭은 16이 증가하였다.
두 경우를 잘 살펴보면 같은 정수형 2차원 배열 임에도 불구하고 포인터 연산의 증감 폭이 다르다. 포인터 연산 시 증감하는 폭을 결정하는 것은 2차원 배열에서 열의 길이에 따라서 달라짐을 알 수 있다.
두 가지 요인을 이용하여 최종 결론을 내리자면 먼저, 2차원 배열에서도 배열 이름을 통하여 배열 전체를 대표하고, 이 배열 이름을 통하여 포인터 연산을 행한다는 점과 같은 타입의 2차원 배열이라고 할지라도 배열 이름을 통하여 포인터 연산을 행할 때 증감의 차이는 열의 길이에 따라서 증감의 폭이 결정된다. 결국, 이 증감의 폭까지 같아야 비로소 같은 포인터 형이 된다는 점.
위의 결론을 토대로 7번 라인에서 알 수 있는 정보는 2차원 배열 이름(2차원 배열의 첫 주소)과 포인터 연산 시 증감하는 크기 그리고 자료 형을 알 수 있기 때문에 이를 반영하여 8번 라인처럼 2차원 배열을 받는 포인터 변수를 선언할 수 있다. pArr은 정수형 포인터 변수인데 포인터 연산 시 sizeof(int) x 열의 길이(4)만큼 증감하는 2차원 배열의 주소를 받는 포인터다 라고 해석하면 된다.
- 2차원 배열을 받는 포인터와 포인터 배열과 혼동하지 말 것.
- 2차원 배열을 함수의 인자로 전달하기
위와 같이 전달하고, 매개 변수는 두 형태 모두 허용한다.
- 2차원 배열에서 또한 arr[i]=*(arr+i) 방법이 적용된다.
'컴퓨터 언어 정리 > C 언어' 카테고리의 다른 글
15 문자와 문자열 (0) | 2020.09.29 |
---|---|
14 함수 포인터와 void 포인터 (0) | 2020.09.23 |
12 포인터의 포인터 (0) | 2020.09.15 |
11 다차원 배열 (0) | 2020.09.14 |
10 포인터와 함수 (0) | 2020.09.13 |