728x90
반응형

다차원 배열과 포인터의 관계

  • 2차원 배열과 포인터의 잘못된 오해

정수형 2차원 배열의 배열 이름은 정수형 더블 포인터 형이라고 오해하고 2차원 배열의 이름을 매개 변수 혹은 변수로 주소 값을 받을 때 더블 포인터 변수로 받을 수 있다.

<2차원 배열과 포인터의 잘못된 관계>

더블 포인터로 받을 수 있는 것은 포인터 배열의 이름이다.

  • 2차원 배열의 배열 이름의 포인터 형은?

먼저, 알아야 할 것은 arrarr[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) 방법이 적용된다.
728x90
반응형

'컴퓨터 언어 정리 > 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

+ Recent posts