티스토리 뷰

반응형

 

C언어 기초 Chapter 17~18: 다차원 배열과 포인터의 관계 완전 정리


Chapter 17. 다차원 배열

17-1. 다차원 배열의 이해와 활용

2차원 배열 선언

int arr[3][4];  // 3행 4열 배열

초기화

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

👉 메모리에는 행 순서대로 저장됨


2차원 배열 출력

#include <stdio.h>
int main(void) {
    int arr[2][3] = {{1,2,3},{4,5,6}};
    for (int i=0; i<2; i++) {
        for (int j=0; j<3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

출력:

1 2 3
4 5 6

17-2. 3차원 배열

선언 및 초기화

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

👉 인덱스로 접근

printf("%d\n", cube[1][0][1]); // 6

Chapter 18. 다차원 배열과 포인터의 관계

18-1. 2차원 배열과 포인터의 관계

  • 2차원 배열의 이름은 첫 번째 행의 주소
  • arr[i] 는 i번째 행(1차원 배열)의 주소
  • arr[i][j] 는 i행 j열 원소 값

예제:

#include <stdio.h>
int main(void) {
    int arr[2][3] = {{1,2,3},{4,5,6}};
    int (*p)[3] = arr; // 열 크기 3인 배열을 가리키는 포인터

    printf("%d\n", p[0][1]); // 2
    printf("%d\n", *(*(p+1)+2)); // 6
    return 0;
}

18-2. 2차원 배열의 특성과 주의사항

  • 함수에 2차원 배열 전달 시, 열 크기를 반드시 명시해야 함
void printArray(int arr[][3], int rows) {
    for (int i=0; i<rows; i++) {
        for (int j=0; j<3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

👉 호출

int main(void) {
    int nums[2][3] = {{1,2,3},{4,5,6}};
    printArray(nums, 2);
    return 0;
}

⚠️ int arr[][] 처럼 두 번째 크기를 생략하면 컴파일 오류 발생


핵심 정리 ✅

  • 다차원 배열은 행렬/표 데이터 표현에 유용
  • 3차원 배열은 “배열의 배열의 배열”
  • 2차원 배열의 이름은 첫 행의 주소
  • 함수에 2차원 배열 전달 시 열 크기를 반드시 지정해야 함
  • 포인터 연산을 사용하면 arr[i][j] = *(*(arr+i)+j) 와 동일

연습 문제 ✍️

  1. 2행 3열 배열을 선언하고 모든 원소의 합을 구하세요.
  2. 3x3 배열을 선언하고 대각선 합(↘ 방향)을 구하세요.
  3. 2차원 배열을 함수에 전달해 모든 원소를 출력하는 함수를 작성하세요.
  4. 포인터 연산만 이용하여 2차원 배열 { {1,2,3}, {4,5,6} } 의 모든 원소를 출력하세요.

 

 

👉 연습문제 정답은? ▼

 

Chapter 17~18 연습문제 풀이


1) 2행 3열 배열을 선언하고 모든 원소의 합 구하기

#include <stdio.h>
int main(void) {
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int sum = 0;

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            sum += arr[i][j];
        }
    }

    printf("배열의 합 = %d\n", sum);
    return 0;
}

👉 출력: 배열의 합 = 21


2) 3x3 배열 선언하고 대각선 합 구하기 (↘ 방향)

#include <stdio.h>
int main(void) {
    int arr[3][3] = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };
    int sum = 0;

    for (int i = 0; i < 3; i++) {
        sum += arr[i][i];  // 대각선 원소 (i,i)
    }

    printf("대각선 합 = %d\n", sum);
    return 0;
}

👉 출력: 대각선 합 = 15


3) 2차원 배열을 함수에 전달해 모든 원소 출력하기

#include <stdio.h>

void printArray(int arr[][3], int rows) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }
}

int main(void) {
    int nums[2][3] = {{10, 20, 30}, {40, 50, 60}};
    printArray(nums, 2);
    return 0;
}

👉 출력:

10 20 30
40 50 60

4) 포인터 연산만 이용해 2차원 배열 { {1,2,3}, {4,5,6} } 출력하기

#include <stdio.h>
int main(void) {
    int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int (*p)[3] = arr;  // 열 크기가 3인 배열을 가리키는 포인터

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d ", *(*(p + i) + j));
        }
        printf("\n");
    }
    return 0;
}

👉 출력:

1 2 3
4 5 6

핵심 정리 ✅

  • 2차원 배열 합 → 중첩 for문으로 모든 원소 더하기
  • 대각선 합 → arr[i][i] 패턴 이용
  • 함수 전달 시 열 크기 반드시 지정 필요
  • 포인터 연산: arr[i][j] ↔ *(*(arr+i)+j) 동일

 

반응형