티스토리 뷰

BackEnd/C

[19일차] 1. 2차원 배열

JINSUKUKU 2021. 3. 2. 14:28

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언어 코딩 도장 / 위키백과

 

댓글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
최근에 올라온 글
글 보관함
Total
Today
Yesterday