juuuding

CH 18 다차원 배열과 포인터의 관계 본문

C언어/윤성우의 열혈 C

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

jiuuu 2023. 3. 17. 13:06

 1. 2차원 배열이름의 포인터 형

 

1. 1차원 배열이름의 포인터 형과 2차원 배열이름의 포인터 형

 int arr[10]과 같은 1차원 배열이름 arr의 포인터 형은 int형 포인터이다. 그리고 앞서 int* parr[20]의 parr이 int **형 포인터임을 배웠다. 따라서 2차원 배열의 이름이 더블 포인터 형이라는 오해를 절대로 해서는 안 된다.

 

 

2. 2차원 배열이름이 가리키는 것들은?

 int arr2d[3][3]과 같은 2차원 배열에서, 배열이름 arr2d가 가리키는 것은 인덱스 기준으로 [0][0]이다. 더하여 2차원 배열의 경우에는 arr2d[0], arr2d[1], arr2d[2]도 의미를 갖는데, 각각 1행 2행 3행의 첫 번째 요소를 가리킨다. 이처럼 arr2d와 arr2d[0]의 출력 값은 동일한데 그렇다면 이 둘은 같은 것인가? 아니다. arr2d는 첫 번째 요소를 가리키면서 배열 전체를 의미하지만  arr2d[0]은 첫 번째 요소를 가리키되 1행만을 의미한다. 그래서 sizeof의 연산 결과가 서로 다르다. arr2d는 36, arr2d[0]은 12가 나온다. 

 

 

3. 배열이름 기반의 포인터 연산: 배열이름에 1을 더한 결과는?

 1차원 배열이름에서는 결론적으로 배열이름+sizeof(type)의 계산결과가 출력된다. 하지만 2차원 배열이름을 대상으로 증가 감소 연산을 할 경우, 결과는 각 행 첫번째 요소의 주소 값이 된다. 때문에 배열을 이루는 자료형이 동일하더라도 배열의 가로길이가 다르면, 배열이름을 대상으로 하는 포인터 연산의 결과는 달라진다.

 

 

4. 최종결론! 2차원 배열이름의 포인터 형

 int arr[3][4]의 포인터 형 : arr은 가리키는 대상이 int형 변수이고, 포인터 연산 시 sizeof(int) x 4의 크기 단위로 값이 증감하는 포인터 형이다.

위와 같이 2차원 배열의 포인터 형을 표현하기 위해서는 2가지 정보가 필요하다. 가리키는 대상과 실제로 얼마가 증가하고 감소하는지에 대한 정보가 필요하다는 것이다. 가리키는 대상이 int형 변수이면서 포인터 연산시 sizeof(int) x 4 크기 단위로 증감하는 포인터 변수 ptr은 다음과 같이 선언한다. int (*ptr) [4]; 이와 같은 포인터 변수는 2차원 배열을 가리키는 용도로만 사용되기 때문에 '배열 포인터 변수'라고 한다.

 추가로 2차원 배열의 포인터 형을 결정짓는 연습을 하자면,

char (*arr1) [4] : arr1은 가리키는 대상이 char형 변수이고, 포인터 연산 시 sizeof(char) x 4 크기 단위로 증감하는 포인터 형

double (*arr2) [7] : arr2는 가리키는 대상이 double형 변수이고, 포인터 연산 시 sizeof(double) x 7 크기 단위로 증감하는 포인터 형 

이라고 할 수 있다. 

 

 

 

 2. 2차원 배열이름의 특성과 주의사항

 

1. 주의! '배열 포인터' 와 '포인터 배열'을 혼동하지 말자

int * whoA [4] : 포인터 배열 → int형 포인터 변수로 이뤄진 int형 포인터 배열

int (*whoB) [4] : 배열 포인터 → 가로길이가 4인 int형 2차원 배열을 가리키는 용도의 포인터 변수

 

 

2. 2차원 배열을 함수의 인자로 전달하기

int main(void) {

	int arr1[2][7];
	double arr2[4][5];
	SimpleFunc(arr1, arr2);

}

arr1과 arr2의 주소 값을 전달 받을 수 있는 매개변수 이름을 각각 parr1과 parr2라 하면, int (*parr1) [7], double (*parr2) [5]로 선언할 수 있다. 그리고 이를 대신해서 int parr1 [][7], double parr2 [][5] 로도 선언이 가능하다.

 

 

3. 2차원 배열에서도 arr[i]와 *(arr+i)는 같다.

arr[2][1] = 4는 (*(arr+2))[1] = 4, *(arr[2]+1)=4 , *(*(arr+2)+1)=4로 대신할 수 있다. 

'C언어 > 윤성우의 열혈 C' 카테고리의 다른 글

CH 21 문자와 문자열 관련 함수  (0) 2023.03.21
CH 19 함수 포인터와 void 포인터  (0) 2023.03.20
CH 17 포인터의 포인터  (0) 2023.03.17
CH 16 다차원 배열  (0) 2023.03.16
CH 15 도전! 프로그래밍 2  (0) 2023.03.16