티스토리 뷰
2021.03.02.화
2차원 배열 선언과 요소 사용
✔ 4개 과목 점수를 한 명의 학생의 것만 처리할 때에는 int형 배열 하나로 가능하다.
✔ 여러 학생의 점수를 처리해야 할 때에는 같은 형태의 배열이 여러 개 필요한데 이런 경우 2차원 배열을 사용한다.
✔ 말하자면 2차원 배열은 1차원 배열을 요소로 가지는 배열이다.
✔ 2차원 배열을 사용해 1차원 배열 여러 개를 연속성을 지니게 해서 사용할 수 있다.
✔ 2차원 배열은 아래와 같이 행과 열로 표현하고 이해하는 편이 좋다.
score[2][4] | |||||||||||||||
score[0][0] | score[0][1] | score[0][2] | score[0][3] | ||||||||||||
100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 |
score[1][0] | score[1][1] | score[1][2] | score[1][3] | ||||||||||||
116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 |
✔ 2차원 배열의 크기가 커지면 첨자로 특정 위치에 접근하기 어려워진다.
✔ 아래의 공식을 통해 n번째 첨자를 구해서 손쉽게 사용할 수 있다.
arr [ (n-1)/열의 개수 ][ (n-1)% 열의 개수 ] → arr [a][b]
✔ 배열의 첨자는 0부터 시작하므로, n번째 요소는 n-1번째임을 알 수 있다.
✔ 열의 개수로 나눈 몫은 행의 첨자가 되고, 나머지는 열의 첨자가 된다.
2차원 배열의 초기화
✔ 초기화를 하지 않으면 쓰레기 값을 지니게 되므로, 가능하면 선언과 동시에 초기화하자.
✔ 아래와 같은 방법을 사용해 2차원 배열을 초기화할 수 있다.
int arr [2][4] = {
{1, 2, 3, 4} ,
{5, 6, 7, 8}
} ;
✔ 2차원 배열을 선언과 동시에 초기화하는 경우, 행의 값은 입력하지 않아도 입력의 개수에 따라 자동 결정된다.
int arr[][4]={
{1,1,1,1}, // 1 1 1 1 으로 초기화
{2,2,2,2}, // 2 2 2 2 으로 초기화
{3,3,3,3} // 3 3 3 3 으로 초기화
};
✔ 2차원 배열은 결국 1차원 배열의 나열이므로, 1차원 배열과 같은 방법으로 초기화할 수 있다.
int arr[3][4]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
// 1행 1 2 3 4
// 2행 5 6 7 8
// 3행 9 10 11 12
✔ 만약 초기화를 할 때에 초깃값을 부족하게 입력하거나 생략하면, 남은 요소는 0으로 자동 초기화된다.
int arr[3][4]={
{1}, // 1 0 0 0 으로 초기화
{2,3}, // 2 3 0 0 으로 초기화
{4,5,6,7} // 4 5 6 7 으로 초기화
};
✔ 배열의 모든 값을 0으로 초기화하고 싶다면, 첫 번째 요소만 0으로 초기화하자.
int arr[3][4]={ 0 };
// 1행 0 0 0 0
// 2행 0 0 0 0
// 3행 0 0 0 0
2차원 char배열 선언
✔ 하나의 문자열을 저장할 때에는 1차원 배열을 사용하지만, 여러 문자열을 저장할 때에는 2차원 배열을 사용한다.
✔ 다만 문자열의 길이는 알 수 없으므로, 열의 길이는 넉넉하게 선언해야 한다.
✔ 과일의 이름을 저장하는 2차원 char 배열을 만들어보면 아래와 같다.
fruit[2][10] | |||||||||
fruit[0][0] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] |
a | p | p | l | e | \0 | \0 | \0 | \0 | \0 |
fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] |
b | a | n | a | n | a | \0 | \0 | \0 | \0 |
✔ 2차원 배열은 행을 찾는 주소와, 열을 찾는 주소 2개를 가진다.
✔ 즉, 하나의 주소를 저장하는 포인터 변수에는 2개의 주소를 가지는 2차원 배열명을 사용해 주소를 저장할 수 없다
✔ 하나의 행은 1차원 배열 한 개와 동일하기 때문에 각 행의 첫 번째 주소는 포인터 변수에 저장할 수 있다.
✔ 행은 고정되어 있고, 찾아야 하는 주소가 열의 주소 하나라고 보기 때문.
✔ 행은 1로 고정이 되어있고, 열을 차례대로 찾아가는 1차원 배열과 2차원 배열의 하나의 행은 같다고 볼 수 있다.
✔ 2차원 배열 fruit는 2개의 1차원 배열을 요소로 가지므로 아래와 같이 표현할 수 있다.
fruit[2][10] | |||||||||
fruit[0] | |||||||||
fruit[0][0] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] | fruit[0][1] |
a | p | p | l | e | \0 | \0 | \0 | \0 | \0 |
fruit[1] | |||||||||
fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] | fruit[1][0] |
b | a | n | a | n | a | \0 | \0 | \0 | \0 |
✔ 위와 같이 열 첨자를 생략한 부분 배열명을 사용하면, 2차원 배열의 행 하나를 1차원 배열 하나로 인식한다.
✔ 포인터 변수에 2차원 배열의 주소를 저장할 때에는 위와 같이 1개의 주소를 가지도록 부분 배열명을 사용해서 저장해야 한다.
scanf("%s", fruit[0]);
printf("%s", fruit[0]);
✔ 위와 같이 열 첨자를 생략한 부분 배열명을 사용해서 입출력을 할 때에는 형식지정자를 % s를 사용해야 한다.
✔ 그리고 배열명은 곧 주소를 의미하므로, 입력을 받을 때에 주소 연산자인 &를 사용하지 않는다.
2차원 char배열 초기화
✔ 2차원 char배열을 초기화하는 방법은 두 가지가 있다.
✔ 첫 번째 방법은 배열의 요소를 하나하나 초기화하는 방법.
char fruit[2][10]={
{'a','p','p','l','e'},
{'b','a','n','a','n','a'}
};
✔ 두 번째 방법은 각 행의 단위를 문자열로 초기화하는 방법이다.
✔ 2차원 char 배열은 1차원 배열을 요소로 가지므로, 아래와 같이 큰 따옴표와 함께 초기화할 수 있다.
char fruit[][10]={ "apple", "banana" };
✔ 행의 첨자를 생략하면 초기화한 문자열의 개수가 행의 수가 된다.
✔ 값이 입력되지 않은 열의 경우 0(null)으로 자동 초기화된다.
[참고] 한빛미디어-혼자 공부하는 C언어 유튜브 강의 / 엘리스 트랙-혼자 공부하는 C언어 / 길벗-C언어 코딩 도장 / 위키백과
'BackEnd > C' 카테고리의 다른 글
[19일차] 3. 포인터 배열 복습 예제 (0) | 2021.03.02 |
---|---|
[19일차] 2. 3차원 배열/포인터 배열 (0) | 2021.03.02 |
[18일차] 2. 레지스터 변수/주소를 반환하는 함수 (0) | 2021.03.01 |
[18일차] 1. 지역 변수와 전역 변수 (0) | 2021.03.01 |
[15일차] 문자열 관련 함수의 원형 (0) | 2021.02.25 |