본문 바로가기

윤성우의 C Programming

2차원 배열 arr, arr[0], arr[0][0] 의 차이

상상해 보자. arr는 전체 층이 있는 건물이고, arr[0]은 그 건물의 첫 번째 층, arr[0][0] 은 첫 번째 층의 첫 번째 방이다.

  • arr은 건물 전체를 가리킨다. 이는 건물의 주소를 알려주는 것과 같다. 건물이 어디에 있는지 알면, 모든 층에 접근할 수 있다.
  • arr[0]은 건물의 첫 번째 층을 가리킨다. 첫 번째 층의 주소를 알고 있다면, 그 층에 있는 모든 방에 접근할 수 있다. arr[0] 자체는 2차원 배열의 첫 번째 행을 가리키는 포인터이다. *arr과 arr[0] 은 같은 기능을 한다. 
  • arr[0][0]은 첫 번째 층의 첫 번째 방이다. 이것은 구체적인 방, 즉 첫 번째 층에 있는 특정 방의 위치와 그 안에 있는 내용물(데이터)을 나타낸. arr[0][0]을 사용하면 이 방 안에 있는 값에 접근하거나 그 값을 변경할 수 있다.

예시 코드

다음 코드를 보면, arr와 arr[0]이 어떻게 사용되는지 좀 더 명확해지게 될것이다.

#include <stdio.h>

int main() {
    // 2차원 배열 선언: 2층 건물, 각 층에 3개의 방
    int arr[2][3] = {
        {1, 2, 3}, // 첫 번째 층의 방
        {4, 5, 6}  // 두 번째 층의 방
    };

    // arr는 전체 건물을 가리킴
    printf("Address of the building (arr): %p\n", (void*)arr);

    // arr[0]는 첫 번째 층을 가리킴
    printf("Address of the first floor (arr[0]): %p\n", (void*)arr[0]);

    // arr[0][0]는 첫 번째 층의 첫 번째 방에 있는 값
    printf("Value in the first room of the first floor (arr[0][0]): %d\n", arr[0][0]);

    return 0;
}
Address of the building (arr): 0x7ffeeb4078c0
Address of the first floor (arr[0]): 0x7ffeeb4078c0
Value in the first room of the first floor (arr[0][0]): 1
  • arr : 전체 건물(2차원 배열 전체)을 가리킨다. 여기서 주소는 건물의 입구와 같으며, 전체 구조에 대한 정보를 제공한다.
  • arr[0] : 건물의 첫 번째 층(배열의 첫 번째 행)을 나타낸다. 이 역시 주소를 가지며, 첫 번째 층에 접근하는 방법을 알려준다. 주목할 점은 arr와 arr[0]이 같은 주소를 가리킨다는 것이다. 이는 첫 번째 층이 건물의 시작점이기 때문이다.
  • arr[0][0] : 첫 번째 층의 첫 번째 방(배열의 첫 번째 행의 첫 번째 요소)에 있는 실제 값을 나타낸다. 이 값은 첫 번째 방에 "저장된" 데이터이다.

arr[0][i] == (*arr)[i]

참고로 arr[0]*arr는 실제로 같은 값을 나타낸다. arr[0]은 포인터처럼 사용될 수 있으며, arr[0][i] 형태로 첫 번째 행의 i번째 요소에 접근할 수 있다. *arr 역시 포인터처럼 사용될 수 있으며, (*arr)[i] 형태로 첫 번째 행의 i번째 요소에 접근할 수 있다.

예시 코드

int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};

printf("%d\n", arr[0][1]); // 첫 번째 행의 두 번째 요소 출력
printf("%d\n", (*arr)[1]); // 같은 요소 출력

 

두 경우 모두 첫 번째 행의 두 번째 요소인 2를 출력한다