평면 구조의 2차원 배열에 대해 알아보자.
2차원 배열은 가로x세로 형태로 이루어져있으며, 행과 열 모두 0부터 시작한다.
2차원 배열을 선언하고 요소에 접근하기
2차원 배열은 [ ] (대괄호)를 두번 사용하여 선언하며 첫번째 가로에는 세로 크기,
두번째 대괄호에는 가로크기를 지정한다.
일반적으로 2차원 공간은 가로x세로로 표기하지만 배열로 만들때는 세로x가로로 표현한다.
- 자료형 배열이름[세로크기][가로크기];
- 자료형 배열이름[세로크기][가로크기] = {{값, 값, 값}, {값, 값, 값}};
아래는 세로크기가 3, 가로크기가 4인 int형 2차원 배열을 선언하는 방법이다.
#include <stdio.h>
int main()
{
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("%d\n", numArr[0][0]); // 1 : 세로인덱스 0 , 가로인덱스 0
printf("%d\n", numArr[2][3]); // 12 : 세로인덱스 2, 가로인덱스 3
printf("%d\n", numArr[1][2]); // 7 : 세로인덱스 1, 가로인덱스 2
return 0;
}
2차원 배열을 선언하면서 초기화하려면 {} (중괄호)를 사용한다.
먼저 가로 요소들을 묶어주고, 가로줄을 세로 크기만큼 다시 묶어준다.
{ } 안의 값과 줄 개수는 가로, 세로 크기보다 작아도 되지만 크면 안된다.
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
};
단, {}를 사용하여 배열에 값을 할당하는 방법은 배열을 선언할 때만 사용할 수 있으며
이미 선언된 배열에는 사용할 수 없다.
2차원 배열의 요소에 접근하려면 배열 뒤에 [ ] (대괄호)를 두번 사용하며 [ ] 안에 세로와 가로 인덱스를
지정해주면 된다.
- 배열[세로인덱스][가로인덱스]
2차원 배열을 초기화하기
2차원 배열의 요소를 0으로 초기화하는 방법은 간단하다.
#include <stdio.h>
int main()
{
int numArr[3][4] = { 0. };
printf("%d\n", numArr[0][0]); // 1 : 세로인덱스 0 , 가로인덱스 0
printf("%d\n", numArr[2][3]); // 12 : 세로인덱스 2, 가로인덱스 3
printf("%d\n", numArr[1][2]); // 7 : 세로인덱스 1, 가로인덱스 2
return 0;
}
이렇게하면 배열의 모든 값은 0이 나온다.

2차원 배열의 요소에 값 할당하기
배열을 선언할 때 값을 초기화하지 않고, 배열의 요소에 각각 할당해보자.
- 배열[세로인덱스][가로인덱스] = 값;
#include <stdio.h>
int main()
{
int numArr[3][4]; // 세로3, 가로4 크기의 2차원 배열 선언
numArr[0][0] = 1; // 세로0, 가로0 인덱스에 1 할당.
numArr[0][1] = 2; // 세로0, 가로1 인덱스에 2 할당.
numArr[0][2] = 3; // 세로0, 가로2 인덱스에 3 할당.
numArr[0][3] = 4; // 세로0, 가로3 인덱스에 4 할당.
numArr[1][0] = 5; // 세로1, 가로0 인덱스에 5 할당.
numArr[1][1] = 6; // 세로1, 가로1 인덱스에 6 할당.
numArr[1][2] = 7; // 세로1, 가로2 인덱스에 7 할당.
numArr[1][3] = 8; // 세로1, 가로3 인덱스에 8 할당.
numArr[2][0] = 9; // 세로2, 가로0 인덱스에 9 할당.
numArr[2][1] = 10; // 세로2, 가로1 인덱스에 10 할당.
numArr[2][2] = 11; // 세로2, 가로2 인덱스에 11 할당.
numArr[2][3] = 12; // 세로2, 가로3 인덱스에 12 할당.
printf("%d\n", numArr[0][0]); // 1
printf("%d\n", numArr[1][2]); // 7
printf("%d\n", numArr[2][0]); // 9
printf("%d\n", numArr[2][3]); // 12
return 0;
}
2차원 요소의 배열을 출력할때와 마찬가지로 배열의 인덱스(좌표)를 입력하고 넣을 값을 할당하면 된다.
2차원 배열에서 범위를벗어난 인덱스에 접근하면 어떻게 될까?
#include <stdio.h>
int main()
{
int numArr[3][4]; // 세로3, 가로4 크기의 2차원 배열 선언
numArr[0][0] = 1; // 세로0, 가로0 인덱스에 1 할당.
numArr[0][1] = 2; // 세로0, 가로1 인덱스에 2 할당.
numArr[0][2] = 3; // 세로0, 가로2 인덱스에 3 할당.
numArr[0][3] = 4; // 세로0, 가로3 인덱스에 4 할당.
numArr[1][0] = 5; // 세로1, 가로0 인덱스에 5 할당.
numArr[1][1] = 6; // 세로1, 가로1 인덱스에 6 할당.
numArr[1][2] = 7; // 세로1, 가로2 인덱스에 7 할당.
numArr[1][3] = 8; // 세로1, 가로3 인덱스에 8 할당.
numArr[2][0] = 9; // 세로2, 가로0 인덱스에 9 할당.
numArr[2][1] = 10; // 세로2, 가로1 인덱스에 10 할당.
numArr[2][2] = 11; // 세로2, 가로2 인덱스에 11 할당.
numArr[2][3] = 12; // 세로2, 가로3 인덱스에 12 할당.
printf("%d\n", numArr[-1][-1]); // 쓰레기값
printf("%d\n", numArr[0][4]); // 가로 인덱스가 1 추가되어 다음 세로줄인 [1][0]으로
printf("%d\n", numArr[4][0]); // 쓰레기값
printf("%d\n", numArr[5][5]); // 쓰레기값
return 0;
}
2차원 배열의 요소에 접근할 때 인덱스로 음수를 지정하거나, 배열의 크기를 벗어난 인덱스를 지정해도
컴파일 에러는 발생하지 않는다. 하지만 쓰레기값이 출력된다.
즉, 배열의 범위를 벗어난 인덱스에 접근하면 배열이 아닌 다른 메모리 공간에 접근하게 된다.
특히 2차원 배열은 값이 일렬로 쭉 늘어서 있으므로 numArr[0][4]와 같이
가로 인덱스가 범위를 벗어나도록 지정하면 그다음 세로 인덱스 요소인 numArr[1][0]에 접근하게 된다.
2차원 배열의 크기 구하기
2차원 배열을 선언한 뒤 가로, 세로의 크기를 늘려야 할 경우 관련된 반복문의 조건식도 함께 수정해야 하는데 빠뜨리고 넘어갈 수가 있다. 따라서 2차원 배열의 가로, 세로 크기를 구해놓고 반복문에 사용하면 실수를 방지할 수 있다.
2차원 배열이 차지하는 전체 공간과 가로, 세로 요소의 개수는 sizeof 연산자로 구할 수 있다.
다음 내용을 소스 코드 편집창에 입력한 뒤 실행해보자.
#include <stdio.h>
int main()
{
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{7, 8, 9, 10}
};
int col = sizeof(numArr[0]) / sizeof(int); // 가로 요소(4*4) / int 크기(4) = 16 / 4 = 4
int row = sizeof(numArr) / sizeof(numArr[0]); // 전체 크기(48) / 가로 요소(16) = 3
printf("%d\n", sizeof(numArr)); // 48 : 4바이트 크기 요소가 12(4*3)개 이므로 48
printf("%d\n", col); // 4
printf("%d\n", row); // 3
return 0;
}
sizeof로 2차원 배열의 크기를 구해보면 배열이 차지하는 전체 공간이 출력된다.
printf("%d\n", sizeof(numArr)); // 48 : 4바이트 크기 요소가 12개이므로 48
가로(column, 열)의 요소 개수를 구하려면 sizeof(numArr[0])과 같이 가로 한 줄의 크기를 구한 뒤
요소의 크기로 나누면 된다.
int col = sizeof(numArr[0]) / sizeof(int);
// 2차원 배열의 가로 크기를 구할때는 가로 한줄의 크기를 요소로 나눠줌
세로(row, 행)의 요소 개수는 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠준다.
int row = sizeof(numArr) / sizeof(numArr[0]);
// 2차원 배열의 세로 크기를 구할때는 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌.
반복문으로 2차원 배열의 요소를 모두 출력하기
#include <stdio.h>
int main()
{
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{7, 8, 9, 10}
};
int col = sizeof(numArr[0]) / sizeof(int); // 가로 요소(4*4) / int 크기(4) = 16 / 4 = 4
int row = sizeof(numArr) / sizeof(numArr[0]); // 전체 크기(48) / 가로 요소(16) = 3
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", numArr[i][j]);
}
printf("\n");
}
return 0;
}

내 스스로 이해하기 쉽도록 주석을 달아보았다.
'C, C++' 카테고리의 다른 글
C) 싱글 링크드 리스트 구현 + 메모리 추적 (1) | 2024.01.14 |
---|---|
C언어 코딩도장(2차원 배열을 포인터에 넣기) (0) | 2022.04.30 |
C언어 코딩도장(배열: 가장 작은 수 출력하기) (0) | 2022.04.29 |
C언어 코딩도장(배열 사용하기) / 2진수 계산기 (0) | 2022.04.29 |
C언어 코딩도장(메모리 사용하기) (0) | 2022.04.29 |
평면 구조의 2차원 배열에 대해 알아보자.
2차원 배열은 가로x세로 형태로 이루어져있으며, 행과 열 모두 0부터 시작한다.
2차원 배열을 선언하고 요소에 접근하기
2차원 배열은 [ ] (대괄호)를 두번 사용하여 선언하며 첫번째 가로에는 세로 크기,
두번째 대괄호에는 가로크기를 지정한다.
일반적으로 2차원 공간은 가로x세로로 표기하지만 배열로 만들때는 세로x가로로 표현한다.
- 자료형 배열이름[세로크기][가로크기];
- 자료형 배열이름[세로크기][가로크기] = {{값, 값, 값}, {값, 값, 값}};
아래는 세로크기가 3, 가로크기가 4인 int형 2차원 배열을 선언하는 방법이다.
#include <stdio.h>
int main()
{
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
printf("%d\n", numArr[0][0]); // 1 : 세로인덱스 0 , 가로인덱스 0
printf("%d\n", numArr[2][3]); // 12 : 세로인덱스 2, 가로인덱스 3
printf("%d\n", numArr[1][2]); // 7 : 세로인덱스 1, 가로인덱스 2
return 0;
}
2차원 배열을 선언하면서 초기화하려면 {} (중괄호)를 사용한다.
먼저 가로 요소들을 묶어주고, 가로줄을 세로 크기만큼 다시 묶어준다.
{ } 안의 값과 줄 개수는 가로, 세로 크기보다 작아도 되지만 크면 안된다.
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
};
단, {}를 사용하여 배열에 값을 할당하는 방법은 배열을 선언할 때만 사용할 수 있으며
이미 선언된 배열에는 사용할 수 없다.
2차원 배열의 요소에 접근하려면 배열 뒤에 [ ] (대괄호)를 두번 사용하며 [ ] 안에 세로와 가로 인덱스를
지정해주면 된다.
- 배열[세로인덱스][가로인덱스]
2차원 배열을 초기화하기
2차원 배열의 요소를 0으로 초기화하는 방법은 간단하다.
#include <stdio.h>
int main()
{
int numArr[3][4] = { 0. };
printf("%d\n", numArr[0][0]); // 1 : 세로인덱스 0 , 가로인덱스 0
printf("%d\n", numArr[2][3]); // 12 : 세로인덱스 2, 가로인덱스 3
printf("%d\n", numArr[1][2]); // 7 : 세로인덱스 1, 가로인덱스 2
return 0;
}
이렇게하면 배열의 모든 값은 0이 나온다.

2차원 배열의 요소에 값 할당하기
배열을 선언할 때 값을 초기화하지 않고, 배열의 요소에 각각 할당해보자.
- 배열[세로인덱스][가로인덱스] = 값;
#include <stdio.h>
int main()
{
int numArr[3][4]; // 세로3, 가로4 크기의 2차원 배열 선언
numArr[0][0] = 1; // 세로0, 가로0 인덱스에 1 할당.
numArr[0][1] = 2; // 세로0, 가로1 인덱스에 2 할당.
numArr[0][2] = 3; // 세로0, 가로2 인덱스에 3 할당.
numArr[0][3] = 4; // 세로0, 가로3 인덱스에 4 할당.
numArr[1][0] = 5; // 세로1, 가로0 인덱스에 5 할당.
numArr[1][1] = 6; // 세로1, 가로1 인덱스에 6 할당.
numArr[1][2] = 7; // 세로1, 가로2 인덱스에 7 할당.
numArr[1][3] = 8; // 세로1, 가로3 인덱스에 8 할당.
numArr[2][0] = 9; // 세로2, 가로0 인덱스에 9 할당.
numArr[2][1] = 10; // 세로2, 가로1 인덱스에 10 할당.
numArr[2][2] = 11; // 세로2, 가로2 인덱스에 11 할당.
numArr[2][3] = 12; // 세로2, 가로3 인덱스에 12 할당.
printf("%d\n", numArr[0][0]); // 1
printf("%d\n", numArr[1][2]); // 7
printf("%d\n", numArr[2][0]); // 9
printf("%d\n", numArr[2][3]); // 12
return 0;
}
2차원 요소의 배열을 출력할때와 마찬가지로 배열의 인덱스(좌표)를 입력하고 넣을 값을 할당하면 된다.
2차원 배열에서 범위를벗어난 인덱스에 접근하면 어떻게 될까?
#include <stdio.h>
int main()
{
int numArr[3][4]; // 세로3, 가로4 크기의 2차원 배열 선언
numArr[0][0] = 1; // 세로0, 가로0 인덱스에 1 할당.
numArr[0][1] = 2; // 세로0, 가로1 인덱스에 2 할당.
numArr[0][2] = 3; // 세로0, 가로2 인덱스에 3 할당.
numArr[0][3] = 4; // 세로0, 가로3 인덱스에 4 할당.
numArr[1][0] = 5; // 세로1, 가로0 인덱스에 5 할당.
numArr[1][1] = 6; // 세로1, 가로1 인덱스에 6 할당.
numArr[1][2] = 7; // 세로1, 가로2 인덱스에 7 할당.
numArr[1][3] = 8; // 세로1, 가로3 인덱스에 8 할당.
numArr[2][0] = 9; // 세로2, 가로0 인덱스에 9 할당.
numArr[2][1] = 10; // 세로2, 가로1 인덱스에 10 할당.
numArr[2][2] = 11; // 세로2, 가로2 인덱스에 11 할당.
numArr[2][3] = 12; // 세로2, 가로3 인덱스에 12 할당.
printf("%d\n", numArr[-1][-1]); // 쓰레기값
printf("%d\n", numArr[0][4]); // 가로 인덱스가 1 추가되어 다음 세로줄인 [1][0]으로
printf("%d\n", numArr[4][0]); // 쓰레기값
printf("%d\n", numArr[5][5]); // 쓰레기값
return 0;
}
2차원 배열의 요소에 접근할 때 인덱스로 음수를 지정하거나, 배열의 크기를 벗어난 인덱스를 지정해도
컴파일 에러는 발생하지 않는다. 하지만 쓰레기값이 출력된다.
즉, 배열의 범위를 벗어난 인덱스에 접근하면 배열이 아닌 다른 메모리 공간에 접근하게 된다.
특히 2차원 배열은 값이 일렬로 쭉 늘어서 있으므로 numArr[0][4]와 같이
가로 인덱스가 범위를 벗어나도록 지정하면 그다음 세로 인덱스 요소인 numArr[1][0]에 접근하게 된다.
2차원 배열의 크기 구하기
2차원 배열을 선언한 뒤 가로, 세로의 크기를 늘려야 할 경우 관련된 반복문의 조건식도 함께 수정해야 하는데 빠뜨리고 넘어갈 수가 있다. 따라서 2차원 배열의 가로, 세로 크기를 구해놓고 반복문에 사용하면 실수를 방지할 수 있다.
2차원 배열이 차지하는 전체 공간과 가로, 세로 요소의 개수는 sizeof 연산자로 구할 수 있다.
다음 내용을 소스 코드 편집창에 입력한 뒤 실행해보자.
#include <stdio.h>
int main()
{
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{7, 8, 9, 10}
};
int col = sizeof(numArr[0]) / sizeof(int); // 가로 요소(4*4) / int 크기(4) = 16 / 4 = 4
int row = sizeof(numArr) / sizeof(numArr[0]); // 전체 크기(48) / 가로 요소(16) = 3
printf("%d\n", sizeof(numArr)); // 48 : 4바이트 크기 요소가 12(4*3)개 이므로 48
printf("%d\n", col); // 4
printf("%d\n", row); // 3
return 0;
}
sizeof로 2차원 배열의 크기를 구해보면 배열이 차지하는 전체 공간이 출력된다.
printf("%d\n", sizeof(numArr)); // 48 : 4바이트 크기 요소가 12개이므로 48
가로(column, 열)의 요소 개수를 구하려면 sizeof(numArr[0])과 같이 가로 한 줄의 크기를 구한 뒤
요소의 크기로 나누면 된다.
int col = sizeof(numArr[0]) / sizeof(int);
// 2차원 배열의 가로 크기를 구할때는 가로 한줄의 크기를 요소로 나눠줌
세로(row, 행)의 요소 개수는 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠준다.
int row = sizeof(numArr) / sizeof(numArr[0]);
// 2차원 배열의 세로 크기를 구할때는 배열이 차지하는 전체 공간을 가로 한 줄의 크기로 나눠줌.
반복문으로 2차원 배열의 요소를 모두 출력하기
#include <stdio.h>
int main()
{
int numArr[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{7, 8, 9, 10}
};
int col = sizeof(numArr[0]) / sizeof(int); // 가로 요소(4*4) / int 크기(4) = 16 / 4 = 4
int row = sizeof(numArr) / sizeof(numArr[0]); // 전체 크기(48) / 가로 요소(16) = 3
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%d ", numArr[i][j]);
}
printf("\n");
}
return 0;
}

내 스스로 이해하기 쉽도록 주석을 달아보았다.
'C, C++' 카테고리의 다른 글
C) 싱글 링크드 리스트 구현 + 메모리 추적 (1) | 2024.01.14 |
---|---|
C언어 코딩도장(2차원 배열을 포인터에 넣기) (0) | 2022.04.30 |
C언어 코딩도장(배열: 가장 작은 수 출력하기) (0) | 2022.04.29 |
C언어 코딩도장(배열 사용하기) / 2진수 계산기 (0) | 2022.04.29 |
C언어 코딩도장(메모리 사용하기) (0) | 2022.04.29 |