티스토리 뷰

C언어

C언어 2차원 배열과 포인터 정리

박완희버서커 2025. 7. 7. 17:26
반응형
🧭 C언어 2차원 배열과 포인터 정리

🧭 C언어 2차원 배열과 포인터 정리


📌 2차원 배열의 메모리 구조

2차원 배열을 선언합니다:


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

메모리 안에는 이렇게 저장됩니다:

[1][2][3][4][5][6][7][8][9]

즉, row-major order로 1차원 배열처럼 일렬로 저장됩니다.

그렇다면 여기서 arr[1]에 저장된 값은 일렬로 저장된 배열에서처럼 2가 저장돼 있을까요?
이를 하나씩 살펴보기로 합니다.



📌 포인터가 가리키는 위치

2차원 배열에서 포인터로 접근할 때, 표현에 따라 가리키는 의미가 달라집니다.



🔷 arr

arr는 배열의 이름이고, 타입은 int[3][3]입니다.
하지만 포인터처럼 쓰일 때는 첫 번째 행 전체의 주소입니다.
즉:

arr ≡ &arr[0]

메모리상:

arr → [1][2][3]


🔷 arr[0]

arr[0]은 배열의 첫 번째 행의 이름입니다.
타입은 int[3], 메모리 주소로는 &arr[0][0]입니다.

메모리상:

arr[0] → [1][2][3]


🔷 arr[1]

arr[1]은 배열의 두 번째 행의 이름입니다.
타입은 int[3], 메모리 주소로는 &arr[1][0]입니다.

메모리상:

arr[1] → [4][5][6]


🔷 &arr[1][0]

&arr[1][0]은 배열의 두 번째 행 첫 번째 요소의 주소입니다.
이것은 arr[1]과 동일한 주소입니다.
하지만 타입은 int*입니다.

메모리상:

&arr[1][0] → [4]


📌 요약 도식

아래 도식은 각 표현과 메모리의 대응을 나타냅니다.

메모리:
[1][2][3][4][5][6][7][8][9]

표현        → 가리키는 메모리
--------------------------------
arr         → [1][2][3] (첫 번째 행)
arr[0]      → [1][2][3] (첫 번째 행)
arr[1]      → [4][5][6] (두 번째 행)
&arr[0][0]  → [1]       (첫 번째 요소)
&arr[1][0]  → [4]       (두 번째 행 첫 번째 요소)


📌 타입 차이

표현 주소값은 같음? 타입
arr[1] &arr[1][0] int[3] → decay → int*
&arr[1][0] &arr[1][0] int*

주소값은 동일하지만, 선언된 타입이 달라 포인터 연산에 차이가 납니다.



📌 핵심 요약

  • ✅ 2차원 배열도 메모리에선 1차원 배열처럼 연속 저장됩니다.
  • arr[1]&arr[1][0]은 같은 메모리 위치를 가리킵니다.
  • arr[1]int[3] 배열 이름이고, &arr[1][0]int*입니다.
  • ✅ 타입이 다르지만 주소는 같습니다.


📌 정리 도식

[1][2][3][4][5][6][7][8][9]
 ↑          ↑
arr         arr[1] ≡ &arr[1][0]


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함
반응형