[C++] 배열 (1차원, 2차원 배열 초기화)

2026. 2. 10. 17:36·coding test - C++
728x90
반응형


배열 복사와 초기화의 원리 

C에서 배열은 일반 변수와 전혀 다르게 동작한다.
특히 함수 전달 방식(값 vs 참조), 초기화 방식(전역 vs 지역), 그리고 복사 개념을 정확히 이해하지 못하면 의도치 않은 버그가 쉽게 발생한다.

이 글에서는 다음을 단계적으로 정리한다.

  1. 1차원 배열 복사
  2. 배열을 함수에 넘길 때의 원리(참조 전달)
  3. 2차원 배열 복사
  4. 배열 초기화 규칙
  5. C와 C++의 지역 배열 초기화 차이
  6. 디버깅 출력 팁 (%2d)

1. 1차원 배열 복사

코드

#include <stdio.h>

#define MAX (5 + 3)

int a[MAX];

void copyArr(int copy[MAX], int original[MAX])
{
    for (int i = 0; i < 5; i++)
        copy[i] = original[i];
}

void copyInteger(int i, int k)
{
    i = k;   // 값 복사
}

int main()
{
    int value1 = 5, value2 = 3;

    copyInteger(value1, value2);
    printf("value1 = %d / value2 = %d\n", value1, value2);

    for (int i = 0; i < 5; i++) a[i] = i;

    printf("a : ");
    for (int i = 0; i < 5; i++) printf("%d ", a[i]);
    putchar('\n');

    int b[MAX];
    for (int i = 0; i < 5; i++) b[i] = a[i];

    printf("b : ");
    for (int i = 0; i < 5; i++) printf("%d ", b[i]);
    putchar('\n');

    int c[MAX];
    copyArr(c, a);

    printf("c : ");
    for (int i = 0; i < 5; i++) printf("%d ", c[i]);
    putchar('\n');

    return 0;
}

실행 결과

value1 = 5 / value2 = 3
a : 0 1 2 3 4
b : 0 1 2 3 4
c : 0 1 2 3 4

핵심 원리 정리

  1. 일반 변수는 값 복사
copyInteger(value1, value2);
  • value1, value2는 값이 그대로 복사되어 함수에 전달된다.
  • 함수 내부에서 i = k를 해도 원본 value1은 변하지 않는다.
  • 그래서 결과는 그대로 value1 = 5이다.
  1. 배열은 주소(참조) 전달

함수 선언은 이렇게 보이지만:

void copyArr(int copy[MAX], int original[MAX])

실제로는 다음과 동일하다.

void copyArr(int *copy, int *original)

즉, 배열 전체가 복사되는 것이 아니라 배열의 시작 주소만 전달된다.
따라서 함수 안에서 배열을 수정하면 원본 배열도 함께 바뀐다.

예를 들어:

copy[0] = 999;

라고 하면 original[0]도 999가 된다.

정리하면 다음과 같다.

전달 대상방식

int x 값 복사
int arr[] 주소 전달(참조)

2. 2차원 배열 복사

코드

#include <stdio.h>

#define MAX (5 + 3)

int MAP[MAX][MAX];

void printMap(int map[MAX][MAX])
{
    for (int r = 0; r < 5; r++)
    {
        for (int c = 0; c < 5; c++)
            printf("%03d ", map[r][c]);
        putchar('\n');
    }
    putchar('\n');
}

void copyMAP(int copy[MAX][MAX], int original[MAX][MAX])
{
    for (int r = 1; r <= 5; r++)
        for (int c = 1; c <= 5; c++)
            copy[r][c] = original[r][c];
}

int main()
{
    int number = 0;
    for (int r = 0; r < 5; r++)
        for (int c = 0; c < 5; c++)
            MAP[r][c] = number++;

    printMap(MAP);
    return 0;
}

출력(일부)

000 001 002 003 004
005 006 007 008 009
010 011 012 013 014
015 016 017 018 019
020 021 022 023 024

원리 정리

  • 2차원 배열도 함수로 넘기면 주소 전달이다.
  • 단순 대입(copy = original)은 불가능하다.
  • 반드시 반복문으로 요소를 하나씩 복사해야 한다.

3. 배열 초기화 (전역 vs 지역)

코드

#define MAX (5 + 3)

int MAP[MAX][MAX];  // 전역 배열

void printMap(int map[MAX][MAX])
{
    for (int r = 1; r <= 5; r++)
    {
        for (int c = 1; c <= 5; c++)
            printf("%d ", map[r][c]);
        putchar('\n');
    }
    putchar('\n');
}

int main()
{
    printMap(MAP);

    int dummy[MAX][MAX] = { 0 };
    printMap(dummy);

    return 0;
}

출력

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

초기화 규칙 정리

종류초기값

전역 배열 자동으로 0
정적 배열(static) 자동으로 0
지역 배열(스택) 쓰레기 값

예:

int x;        // 지역 변수 → 쓰레기 값
static int y; // 0으로 초기화

이 규칙은 C와 C++ 모두 동일하다.


4. 배열 부분 초기화

코드

int a[5] = { 1, 2, 3, 4, 5 };
int b[5] = { 1, 2, 3, 4 };   // 나머지는 0
int d[]  = { 1, 2, 3, 4, 5 }; // 크기 자동 결정

출력

a : 1 2 3 4 5
b : 1 2 3 4 0
d : 1 2 3 4 5

규칙

  • 초기값이 부족하면 나머지는 자동으로 0이 된다.
  • 배열 크기는 생략할 수 있다.

5. 2차원 배열 부분 초기화

코드

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

출력

1 0 0 0 0
1 2 0 0 0
1 2 3 0 0
1 2 3 4 0
0 0 0 0 0

해석

  • 각 행에서 값이 부족하면 나머지는 0으로 채워진다.
  • 마지막 행은 전부 0이다.

6. 배열 복사와 “원본이 바뀌는지”에 대한 정리

다음 두 경우를 구분해야 한다.

  1. 일반 변수 복사
int x = 5;
int y = x;
y = 10;

이 경우 x는 변하지 않는다.

  1. 배열 복사(주소 전달)
int arr1[5] = {1,2,3,4,5};
int arr2[5];
copyArr(arr2, arr1);

만약 copyArr 내부에서 다음을 실행하면:

copy[0] = 999;

arr1[0]도 999가 된다.
즉, 함수로 전달된 배열은 원본을 공유한다.


7. 디버깅 출력 팁 — %2d 사용

단순 출력:

printf("%d ", x);

정렬 출력:

printf("%2d ", x);

예:

 0  1  2  3  4
 5  6  7  8  9
10 11 12 13 14

숫자가 자리 정렬되어 표처럼 읽기 쉬워진다.


최종 요약

  1. 일반 변수는 값 복사, 배열은 주소 전달이다.
  2. 배열을 진짜 복사하려면 반복문으로 하나씩 대입해야 한다.
  3. 전역/정적 배열은 자동 0 초기화, 지역 배열은 쓰레기 값이다.
  4. 부분 초기화 시 나머지 요소는 0으로 채워진다.
  5. 2차원 배열도 동일한 규칙을 따른다.
  6. 디버깅 시 %2d 또는 %3d 출력이 가독성이 좋다.

 

728x90
반응형

'coding test - C++' 카테고리의 다른 글

백준 / 괄호 / C++  (0) 2026.02.15
C 문자열이 동일한지 비교 (포인터) / C++ strcmp(a, b) 에서 a == b 이면 0 을 반환함 - 아스키코드 차이로 같은 문자열인지 확인하기  (0) 2026.02.15
'coding test - C++' 카테고리의 다른 글
  • 백준 / 괄호 / C++
  • C 문자열이 동일한지 비교 (포인터) / C++ strcmp(a, b) 에서 a == b 이면 0 을 반환함 - 아스키코드 차이로 같은 문자열인지 확인하기
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (639)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (304)
        • Programmers (169)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (3)
        • Programmers (11)
        • 백준 (8)
        • 기본기문제 (3)
      • 공부정리 (139)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (3)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (1)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    소수
    백준
    programmers
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
[C++] 배열 (1차원, 2차원 배열 초기화)
상단으로

티스토리툴바