37.1 2차원 배열
2차원 배열
2차원 배열은 가로⨉세로 형태로 이루어져 있으며, 행과 열 모두 0부터 시작한다.
2차원 배열 선언
- 대괄호
[ ]
를 두 번 사용하여 선언한다. - 첫 번째 대괄호에는 세로 크기, 두 번째 대괄호에는 가로 크기를 지정한다.
- 배열로 만들 때는
세로 ⨉ 가로
로 표기한다. - 2차원 배열을 선언하면서 초기화할 때는
{ }
로 가로 요소를 먼저 묶어주고, 가로 줄을 세로 크기 만큼 다시 묶어 준다. { }
안의 값과 줄 개수는 가로, 세로 크기보다 작아도 되지만 크면 안된다.
자료형 배열이름[세로크기][가로크기];
자료형 배열이름[세로크기][가로크기] = { { 값, 값, 값 }, { 값, 값 값 } }
{ }
를 사용하여 배열에 값을 할당하는 방법은 _-배열을 선언__할 때만 사용할 수 있으며, 이미 선언된 배열에는 사용할 수 없다.
2차원 배열의 요소
2차원 배열의 요소에 접근하려면 배열 뒤에 [ ]
를 두 번 사용하여 세로와 가로의 인덱스를 지정해주면 된다.
배열[세로인덱스][가로인덱스]
#include <stdio.h>
int main()
{
int numArr[3][4] = { // 세로 크기 3, 가로 크기 4인 int형 2차원 배열 선언
{ 11, 22, 33, 44 },
{ 55, 66, 77, 88 },
{ 99, 110, 121, 132 }
};
// ↓ 세로 인덱스
printf("%d\n", numArr[0][0]); // 11 : 세로 인덱스 0, 가로 인덱스 0인 요소 출력
printf("%d\n", numArr[1][2]); // 77 : 세로 인덱스 1, 가로 인덱스 2인 요소 출력
printf("%d\n", numArr[2][0]); // 99 : 세로 인덱스 2, 가로 인덱스 0인 요소 출력
printf("%d\n", numArr[2][3]); // 132: 세로 인덱스 2, 가로 인덱스 2인 요소 출력
// ↑ 가로 인덱스
return 0;
}
배열의 초기화
2차원 배열을 초기화 할 때, 가로 요소를 중괄호로 묶지 않아도 컴파일이 잘 된다. 물론 결과도 가로 요소를 중활호로 묶었을 때와 같다. 하지만 이렇게 작성하면 이해하기가 어려워서 잘 쓰이지 않는다.
int numArr[3][4] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132 };
2차원 배열 초기화
모두 0으로 초기화
#include <stdio.h>
int main()
{
int numArr[3][4] = { 0, }; // 2차원 배열의 요소를 모두 0으로 초기화
printf("%d\n", numArr[0][0]); // 0: 세로 인덱스 0, 가로 인덱스 0인 요소 출력
printf("%d\n", numArr[1][2]); // 0: 세로 인덱스 1, 가로 인덱스 2인 요소 출력
printf("%d\n", numArr[2][0]); // 0: 세로 인덱스 2, 가로 인덱스 0인 요소 출력
printf("%d\n", numArr[2][3]); // 0: 세로 인덱스 2, 가로 인덱스 3인 요소 출력
return 0;
}
- 2차원 배열을 선언할 때
{ 0 , }
을 할당하면 배열의 요소를 모두 0으로 초기화 할 수 있다. - 0을 일일이 나열하지 않아도 된다.
2차원 배열의 요소에 값 할당
배열을 선언할 때 값을 초기화하지 않고, 배열의 요소에 각각 할당해보자
- 출력할 때와 마찬가지로
[ ]
에 인덱스를 지정한 뒤 값을 할당하면 된다.배열[세로인덱스][가로인덱스] = 값;
#include <stdio.h>
int main()
{
int numArr[3][4];
numArr[0][0] = 11; // 세로 인덱스 0, 가로 인덱스 0인 요소에 값 할당
numArr[0][1] = 22; // 세로 인덱스 0, 가로 인덱스 1인 요소에 값 할당
numArr[0][2] = 33; // 세로 인덱스 0, 가로 인덱스 2인 요소에 값 할당
numArr[0][3] = 44; // 세로 인덱스 0, 가로 인덱스 3인 요소에 값 할당
numArr[1][0] = 55; // 세로 인덱스 1, 가로 인덱스 0인 요소에 값 할당
numArr[1][1] = 66; // 세로 인덱스 1, 가로 인덱스 1인 요소에 값 할당
numArr[1][2] = 77; // 세로 인덱스 1, 가로 인덱스 2인 요소에 값 할당
numArr[1][3] = 88; // 세로 인덱스 1, 가로 인덱스 3인 요소에 값 할당
numArr[2][0] = 99; // 세로 인덱스 2, 가로 인덱스 0인 요소에 값 할당
numArr[2][1] = 110; // 세로 인덱스 2, 가로 인덱스 1인 요소에 값 할당
numArr[2][2] = 121; // 세로 인덱스 2, 가로 인덱스 2인 요소에 값 할당
numArr[2][3] = 132; // 세로 인덱스 2, 가로 인덱스 3인 요소에 값 할당
printf("%d\n", numArr[0][0]); // 11 : 세로 인덱스 0, 가로 인덱스 0인 요소 출력
printf("%d\n", numArr[1][2]); // 77 : 세로 인덱스 1, 가로 인덱스 2인 요소 출력
printf("%d\n", numArr[2][0]); // 99 : 세로 인덱스 2, 가로 인덱스 0인 요소 출력
printf("%d\n", numArr[2][3]); // 132: 세로 인덱스 2, 가로 인덱스 3인 요소 출력
return 0;
}
'
-
2차원 배열에서 범위를 벗어난 인덱스에 접근하면 컴파일 에러는 발생하지 않지만, 배열이 아닌 다른 메모리 공간에 접근하게 되어 쓰레기값이 출력된다.
-
또한, 2차원 배열은 값이 일렬로 쭉 늘어서 있으므로 numArr[0][4]와 같이 가로 인덱스가 범위를 벗어나도록 지정하면 그 다음 세로 인덱스 요소인 numArr[1][0]에 접근하게 된다.
printf("%d\n", numArr[-1][-1]); // 음수이므로 잘못된 인덱스
printf("%d\n", numArr[0][4]); // 가로 인덱스가 배열의 범위를 벗어남
printf("%d\n", numArr[4][0]); // 세로 인덱스가 배열의 범위를 벗어남
printf("%d\n", numArr[5][5]); // 세로, 가로 인덱스 모두 배열의 범위를 벗어남
/*
실행 결과
-858993460 (쓰레기 값)
55 (원하지 않는 요소 [1][0]에 접근)
4687800 (쓰레기 값)
2359296 (쓰레기 값)
*/
출처
https://dojang.io/mod/page/view.php?id=306
https://dojang.io/mod/page/view.php?id=307
https://dojang.io/mod/page/view.php?id=308
https://dojang.io/mod/page/view.php?id=309
Author And Source
이 문제에 관하여(37.1 2차원 배열), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@shuajjjjj/37.1-2차원-배열저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)