C언어/C언어

2차원 배열

ksge7 2020. 7. 13. 03:37

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차원 배열 자체는 통째로 포인터로 할당된 것을 알 수 있다.
}