C & C++

[C언어] 2차원 배열 선언, 값 접근/수정/출력 방법 및 문자열 배열

jimmy_AI 2022. 4. 17. 17:32
반응형

C언어 2차원 array 사용 방법 예제

이번 글에서는 C언어에서 2차원 배열을 선언하는 방법과 주요 특징을 먼저 살펴본 뒤,

값에 접근, 수정 및 출력하는 과정을 다루어보고

2차원 배열의 특수 케이스인 문자열(string) 배열에 대해서까지 말씀드려보도록 하겠습니다.

 

 

2차원 배열 선언, 특징

C언어에서 2차원 이상의 다차원 배열 선언 방법은

자료형 변수명 [1차 배열 크기][2차 배열 크기]... = {값} 형식으로 코드를 작성해주시면 됩니다.

 

아래는 2 * 3 크기의 int 2차원 배열과 3 * 4 크기의 double 2차원 배열을 선언한 예시입니다.

#include <stdio.h>

int main(){

/* [[1, 2, 3],
   [4, 5, 6]] 꼴의 2차원 정수 배열 */
int arr1 [2][3] = {
  {1, 2, 3},
  {4, 5, 6}
};

/* [[0.1, 0.2, 0.3, 0.4],
   [1.0, 2.0, 0.0, 0.0],
   [0.0, 0.0, 0.0, 0.0]] 꼴의 2차원 정수 배열 */
double arr2 [3][4] = {
  {0.1, 0.2, 0.3, 0.4},
  {1, 2, },
  {}
};

}

값을 적어주지 않은 자리는 기본적으로 0으로 채워지는 것도 확인해볼 수 있었습니다.

 

참고로, 위 방법으로 2차원 배열 선언 시 array 내 모든 값의 자료형은 1가지로 통일되어야하며,

내부 배열들의 크기도 모두 일치해야 합니다.

([[1], [1, 2], [1, 2, 3]] 같이 크기가 다른 내부 배열이 섞인 상태 선언은 불가능합니다.)

 

위 방법 말고도 포인터 형태 혹은 동적 할당을 이용한 방법으로도 2차원 배열 선언이 가능합니다.

다만, 이 글에서는 해당 방법 설명은 생략하며, 이는 추후 포스팅에서 다루어보도록 하겠습니다.

 

 

2차원 배열 값 접근, 수정 및 출력

값에 접근하기

이중 인덱싱을 통하여 2차원 배열 내 특정 위치 값을 쉽게 추출할 수 있습니다.

인덱스 번호는 0부터 시작한다는 점에 유의하며, 값 접근 결과 예시를 아래에서 확인해보세요.

#include <stdio.h>

int main(){

int arr1 [2][3] = {
  {1, 2, 3},
  {4, 5, 6}
};

// 배열 내 각 원소 값 추출 결과 확인
printf("%d\n", arr1[0][0]); // 1
printf("%d\n", arr1[0][1]); // 2
printf("%d\n", arr1[0][2]); // 3
  
printf("%d\n", arr1[1][0]); // 4
printf("%d\n", arr1[1][1]); // 5
printf("%d\n", arr1[1][2]); // 6

}

인덱싱 시 인덱스의 범위가 초과되지 않도록 유의해주시길 바랍니다.

반응형

값 수정하기

C언어에서 다차원 array 내 각 값에 대하여 저장된 값을 변경하는 과정을 지원합니다.

인덱싱 위치 = 변경할 값 형태로 재선언을 해주시면 해당 위치 값이 수정됩니다.

아래 예시에서 [0][0] 위치의 값을 바꾼 결과를 확인해보세요.

#include <stdio.h>

int main(){

int arr1 [2][3] = {
  {1, 2, 3},
  {4, 5, 6}
};

// 변경 전
printf("%d\n", arr1[0][0]); // 1

arr1[0][0] = 100;

// 변경 후
printf("%d\n", arr1[0][0]); // 100

}

 

배열 출력하기

내부 배열 전체를 한번에 출력하는 것은 어렵지만,

각 원소 출력 방법을 통하여 다중 for문으로 배열의 형태를 적당히 유지하며 출력할 수 있습니다.

 

아래는 2중 for문을 통하여 배열을 통째로 출력한 예시 코드입니다.

#include <stdio.h>

int main(){

int arr1 [2][3] = {
  {1, 2, 3},
  {4, 5, 6}
};

printf("["); // 첫 열림 괄호 출력
for(int i = 0; i < 2; i++){
  printf("{"); // 내부 배열 열림 괄호 출력

  // 각 원소 출력
  for(int j = 0; j < 3; j++){
  printf(" %d ", arr1[i][j]);}

  printf("}"); // 내부 배열 닫힘 괄호 출력

  // 마지막 줄이면 닫힘 괄호 출력, 아니면 줄바꿈만 출력
  if(i != 1){
  printf("\n");
}else{
    printf("]\n");
}
  
}

}

위 코드에서는 외부 배열 괄호는 [], 내부 배열 괄호는 {}으로 구분해 보았습니다.

이에 대한 출력 결과는 아래와 같았습니다.

 

 

문자열(string) 배열 예시

C언어에서 문자열 자체를 하나의 char 자료형의 배열로 볼 수 있으므로,

문자열들을 모은 배열은 char 자료형의 2차원 배열로 취급할 수 있습니다.

 

먼저, C언어에서 문자열을 다루는 방법이 궁금하시다면 아래의 글을 참고하세요.

 

[C언어] 문자열 선언 방법 정리(배열, 포인터)

C언어 string 배열 및 포인터 선언 예제 및 특징 비교 C언어에서 문자열(string) 자료를 char 배열로 선언하는 경우와 포인터를 이용하여 선언하는 경우의 예시 코드를 살펴보고, 이 두 문자열 선언 경

jimmy-ai.tistory.com

 

각 자리에 최대 10글자의 문자열을 4개를 저장할 수 있는 string 배열을 선언한

예시 코드는 아래와 같습니다.

#include <stdio.h>

int main(){

char arr3[4][10] = {"hello!", "hi!", "apple",};

printf("%s\n", arr3[0]); // hello!
printf("%s\n", arr3[1]); // hi!
printf("%s\n", arr3[2]); // apple
printf("%s\n", arr3[3]); // 빈 문자열 출력
  
}

이 경우, 선언 시 비워둔 자리는 null 문자(\0)로 채워지게 됩니다.

 

이중 인덱싱을 통하여 각 글자를 추출 및 수정하는 것 또한 가능합니다.

#include <stdio.h>

int main(){

char abc[4][10] = {"hello!", "hi!", "apple",};

// 특정 위치의 글자만 추출하여 출력
printf("%c\n", abc[0][0]); // h

// 특정 위치 글자 변경
abc[0][0] = 'j';

// 변경 결과 확인
printf("%s\n", abc[0]); // jello!
  
}