상상해 보자. 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를 출력한다
'윤성우의 C Programming' 카테고리의 다른 글
Chapter 19. 함수 포인터와 void 포인터 (1) | 2024.03.05 |
---|---|
'배열 포인터' 와 '포인터 배열'을 혼동하지 말자 (0) | 2024.03.02 |
2차원 배열이름의 포인터 형 (0) | 2024.03.02 |
포인터 배열과 포인터 배열의 포인터 형 (0) | 2024.03.02 |
Chapter 14. 포인터와 함수에 대한 이해 (0) | 2024.03.02 |