-
1. 2차원 배열이란?
가장 기본적인 배열은 1차원 배열이다.
1차원 배열은 아래와 같이 입력한 값을 단순히 나열하는 것에 그친다.
#include <stdio.h> int main(void){ int scores[5] = {60, 70, 80, 70, 75}; }
하지만 2차원 배열은 다르다.
1차원이 단순히 입력한 값을 나열한 것에 불과한데 반해 2차원은 행과 열을 가지고 있다.
행과 열 두가지 값을 동시에 가지고 있으며 그 형태는 사각형과 비슷하다.
즉 사각형으로 치면 행은 세로 길이, 열은 가로 길이라고 생각해도 된다.
출력시엔 행과 열을 모두 입력해줘야 한다.
그리고 각 입력값의 주소는 인덱스값이라서 [0][0]에서 시작한다.
#include <stdio.h> int main(void){ int scores[3][5] = { // 가로줄 3개 세로줄 5개의 배열을 만들어준다는 선언. 즉 3행 5열로 만드는 배열. // 2차원 배열을 할 경우에는 중괄호 { }를 두번씩 쳐준다. {99, 90, 95, 93, 91}, {85, 89, 81, 83, 87}, {72, 74, 76, 77, 78} }; printf("%d", scores[1][3]); // 83 출력. 인쇄시 배열의 행과 열의 값을 모두 입력해야 한다. }
위 표현식을 표로 나타내면 다음과 같다.
99 (위치 : [0][0] )
90 (위치 : [0][1] )
95 (위치 : [0][2] )
93 (위치 : [0][3] )
91 (위치 : [0][4] )
85 (위치 : [1][0] )
89 (위치 : [1][1] )
81 (위치 : [1][2] )
83 (위치 : [1][3] )
87 (위치 : [1][4] )
72 (위치 : [2][0] )
74 (위치 : [2][1] )
76 (위치 : [2][2] )
77 (위치 : [2][3] )
78 (위치 : [2][4] )
2. 2차원 배열 초기화 하기
처음 배열을 선언할 때 중괄호 안에 0과 , 를 넣는다. { 0, } 식으로 하면 된다.
#include <stdio.h> int main(void){ int scores[3][5] = {0, }; printf("%d\n", scores[0][3]); // 0 출력. printf("%d\n", scores[1][3]); // 0 출력. printf("%d\n", scores[2][2]); // 0 출력. }
3. 2차원 배열에 값 할당 하기
1번과 달리 각 요소별로 값을 따로 할당할 수 있다.
하지만 이렇게 할 경우 타이핑할 것이 너무 많아진다.
값을 수정하거나 할 때 사용하는 것이 좋다.
#include <stdio.h> int main(void){ int scores[3][5]; scores[0][0] = 99; //0번 행의 0번 열의 요소에 값 할당 scores[0][1] = 90; scores[0][2] = 95; scores[0][3] = 93; scores[0][4] = 91; scores[1][0] = 85; //1번 행의 0번 열의 요소에 값 할당 scores[1][1] = 89; scores[1][2] = 81; scores[1][3] = 83; scores[1][4] = 87; scores[2][0] = 72; scores[2][1] = 74; scores[2][2] = 76; scores[2][3] = 77; scores[2][4] = 78; //2번 행의 4번 열의 요소에 값 할당 }
4. 2차원 배열의 크기 구하기
여기서 말하는 크기는 각 배열이 가진 저장 공간의 값을 말한다
C언어에서 정수형 자료 1개의 크기는 4바이트다.
그래서 아래와 같이 배열의 사이즈를 구하면 저장공간 * 배열 요소의 갯수를 결과값으로 얻을 수 있다.
#include <stdio.h> int main(void){ int scores[3][5] = { {99, 90, 95, 93, 91}, {85, 89, 81, 83, 87}, {72, 74, 76, 77, 78} }; int all = sizeof(scores); // 60출력: 전체 배열의 크기 (4*15) int one = sizeof(scores) / sizeof(int); // 15출력: 전체 배열 / 자료형의 크기 (60/4) int col = sizeof(scores[0]) / sizeof(int); // 세로 줄의 갯수. 가로 한줄의 크기를 요소의 크기로 나눠줌. (20/4) int row = sizeof(scores) / sizeof(scores[0]); // 가로 줄의 갯수. 배열의 전체 공간을 가로 한줄의 크기로 나눠줌. (60/20) printf("%d\n", all); // 60출력 printf("%d\n", one); // 15출력 printf("%d\n", col); // 5출력 printf("%d\n", row); // 3출력 }
5. 2차원 배열의 모든 숫자 출력하기
for문을 이용해서 가로행, 세로열의 숫자들을 대입하는 식으로 인쇄한다.
#include <stdio.h> int main(void){ int scores[3][5] = { {99, 90, 95, 93, 91}, {85, 89, 81, 83, 87}, {72, 74, 76, 77, 78} }; int col = sizeof(scores[0]) / sizeof(int); // 세로줄의 갯수 구하는 식. 가로 한줄의 크기를 요소의 크기로 나눠줌. (20/4) int row = sizeof(scores) / sizeof(scores[0]); // 가로줄의 갯수 구하는 식. 배열의 전체 공간을 가로 한줄의 크기로 나눠줌. (60/20) for (int i = 0; i < row; i++){ // 가로열의 숫자만큼 반복하여 수행하도록 for (int j = 0; j < col; j++){ // 세로행의 숫자만큼 반복하다여 수행하도록 printf("%3d", scores[i][j]); //score[i][j]가 반복되면서 인쇄되도록 } printf("\n"); //가로행 인쇄 끝나고 다음 줄로 넘김 } }
6. 2차원 배열의 포인터 할당
2차원 배열을 포인터에 할당할 경우 "자료형 + (*포인터명)[가로줄의 길이]"로 선언하면 된다.
#include <stdio.h> int main(void){ int scores[3][5] = { {99, 90, 95, 93, 91}, {85, 89, 81, 83, 87}, {72, 74, 76, 77, 78} }; int (*point)[5] = scores; //2차원 배열선 가로의 크기 즉 열만큼의 크기를 입력하고 포인터를 선언해야 함 printf("%p\n", point); // 0x7ffca50ff470출력. 포인터의 주소값 printf("%p\n", *point); // 0x7ffca50ff470출력. 포인터의 주소값 printf("%p\n", *scores); // 0x7ffca50ff470출력. 스코어배열의 주소값 printf("%p\n", &scores); // 0x7ffca50ff470출력. 스코어배열의 주소값 printf("%p\n", &point[0][0]); // 0x7ffca50ff470출력. 포인트의 [0][0]위치 주소값 printf("%p\n", &scores[0][0]); // 0x7ffca50ff470출력. 스코어의 [0][0]위치 주소값 // 위 주소값을 보면 2차원 배열에 포인터값을 지정해줄 경우 // 기본 주소 값은 2차원 배열의 [0][0] 위치의 주소값이 자동 배정됨을 알 수 있다. printf("%d\n", point[0][0]); //99 printf("%d\n", point[1][1]); //89 printf("%d\n", point[2][2]); //76 printf("%d\n", scores[0][0]); //99 printf("%d\n", scores[1][1]); //89 printf("%d\n", scores[2][2]); //76 // 2차원 배열에 포인터 지정시 가로줄의 길이만큼 배정했지만 // 2차원 배열 자체는 통째로 포인터로 할당된 것을 알 수 있다. }
'C언어 > C언어' 카테고리의 다른 글
배열 (0) 2020.07.12 C언어 자료형 (0) 2020.07.12 C언어 기본 준비 (0) 2020.07.09 c언어 기본 문법 - 세미콜론, 중괄호, 주석, 들여쓰기 (0) 2020.07.07 C언어 format specifiers, place holder(형식지정자, 서식지정자) (1) 2020.07.07