본문 바로가기

BackEnd/C

2차원 배열과 1차원 배열의 관계

반응형

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차원 배열을 둘 이상 묶어놓은 것이라 볼 수 있다.




반응형