1. 관계를 왜 따져야 하는가?
자료형이 같고 길이가 동일한 1차원 배열을 여러개 묶어 놓은 것을 2차원 배열로 볼 수 있지 않을까?
1차원 배열과 2차원 배열은 분명 관계가 있다.
2차원 배열에 저장할 수 있는 문자열의 형태를 이해하고, 포인터를 더 깊이 있게 이해하기 위해
1차원 배열과 2차원 배열의 관계를 따져보자.
2. 1차원 배열
다음 3개의 배열을 선언한다고 가정해보자
int arr1[4];
int arr2[4];
int arr3[4];
이 때에 메모리 공간에 형성되는 배열의 구조는 다음과 같다.
위 그림에서 배열의 이름 arr1, arr2, arr3는 각 배열의 주소 정보를 담고 있다.
arr1, arr2, arr3는 변수와 마찬가지로 이름도 있고 , 주소값도 지니나, 배열의 이름은 변수가 아니다!
배열의 이름이 의미하는 값은 상수이기 때문이다. 반면 arr1[0], arr2[1]과 같이 배열 요소 하나하나
는 변수이다. 저장되어 있는 값의 변경이 가능하기 때문이다.
3. 2차원 배열에서 배열의 위치정보를 담고 있는것은?
2차원 배열이 다음과 같이 선언되었다고 해보자
int arr[3][4];
이 때에 메모리 공간에 형성되는 배열의 구조는 다음과 같다
위 그림에서 보여주듯이 배열 이름 arr에는 2차원 배열의 시작 주소 정보가 담겨있다. 그리고 2차
원 배열을 구성하는 각 행의 시작 주소 정보를 담고 있는 arr[0],arr[1],arr[2]도 등장한다.
다음 예제를 통해 확인해보자.
1 2 3 4 5 6 7 8 9 10 11 12 | int main(void) { int arr[3][4]; printf("배열의 시작주소: %d \n", arr); printf(" 1행의 시작주소: %d \n", arr[0]); printf(" 2행의 시작주소: %d \n", arr[1]); printf(" 3행의 시작주소: %d \n", arr[2]); return 0; } | cs |
1 2 3 4 | 배열의 시작주소: 6487584 1행의 시작주소: 6487584 2행의 시작주소: 6487600 3행의 시작주소: 6487616 | cs |
7~9행의 출력 결과가 16씩 차이가 난다. 이는 2차원 배열도 메모리 공간에서는 1차원의 구조를 갖
는것을 증명한다. int형 배열의 가로 길이가 4이므로 한 행이 차지하는 메모리 공간의 크기는
4x4=16이 된다. 따라서 행 단위로 주소 값이 16씩 차이가 난다는 것은 1행의 뒤에 2행이, 2행의 뒤
에 3행이 이어져 있다는 뜻이다.
3. arr과 arr[0]이 가리키는 위치가 같은데 차이점은?
위 예제 출력결과만 봐도 arr과 arr[0]이 동일한 주소값을 가리킨다.
하지만 arr은 배열 전체를 의미하고 arr[0]은 2차원 배열의 첫 번째 행을 의미한다.
이는 sizeof 연산의 결과를 통해서도 확인이 가능하다.
1 2 3 4 5 6 7 8 9 10 | int main(void) { int arr[3][4]; printf("sizeof(arr): %d \n", sizeof(arr)); printf("sizeof(arr[0]): %d \n", sizeof(arr[0])); printf("sizeof(arr[1]): %d \n", sizeof(arr[1])); printf("sizeof(arr[2]): %d \n", sizeof(arr[2])); return 0; } | cs |
1 2 3 4 | sizeof(arr): 48 sizeof(arr[0]): 16 sizeof(arr[1]): 16 sizeof(arr[2]): 16 | cs |
4행과 5행의 출력결과가 다르다. arr이 2차원 배열 전체를 의미하고,
arr[0], arr[1], arr[2]는 각각 길이가 4인 1행, 2행, 3행의 1차원 배열을 의미한다.
이 내용을 그림으로 정리하면 아래와 같다.
결국 2차원 배열은 길이가 동일한 1차원 배열을 둘 이상 묶어놓은 것이라 볼 수 있다.
'BackEnd > C' 카테고리의 다른 글
1차원 배열을 함수의 인자로 전달 (0) | 2019.03.11 |
---|---|
2차원 배열의 각 행의 주소 계산법 (0) | 2019.03.10 |
2차원 배열의 이해와 적용 (0) | 2019.03.10 |
배열을 이용한 문자열의 표현 (0) | 2019.03.10 |
1차원 배열의 이해와 활용 (0) | 2019.03.09 |