[C] 배열

728x90

1. 배열의 정의

동일한 자료형을 갖는 자료들의 리스트이며, 배열의 각 요소는 하나의 변수로 취급합니다.

그리고 배열은 배열명과 첨자로 구분합니다.

2. 배열의 선언 형태

배열의 차원은 첨자의 개수로 표현할 수 있습니다. 첨자란 []를 의미하며 예컨대 A[]는 1차원 배열이라고 할 수 있습니다.

따라서 2차원 배열은 A[][]이 됩니다.

 

배열의 각 요소는 배열명과 첨자로 구분되며 첨자는 0부터 시작합니다.

 

이때 배열의 각 요소는 배열명과 첨자로 구분하는데 배열을 선언하기 위해서는 자료형을 선언해줘야 하며, 기억클래스를 갖습니다.

 

배열을 선언하는 방식은 아래형태로 선언합니다.

자료형 배열명[개수] //1차원 배열
자료형 배열명[행의수][열의수] //2차원 배열
자료형 배열명[면의수][행의수][열의수] //3차원 배열

 

예컨대 int a[10]이면 1차원 배열이고 배열명은 a이며 배열의 크기는 10개이며, 배열값은 int형이라는 의미입니다.

 

그리고 int b[3][4]이면 2차원 배열이고 배열명은 b이고 3행 4열로 된 12개의 요소를 가진 정수형 배열이라는 의미입니다.

 

또한 int c[2][3][4] 이면 3차원 배열이고 배열명은 c이며 2면 3행 4열로 이루어진 24개의 요소를 가진 정수형 배열이라는 의미입니다.

 

C에서는 char형 배열도 가능합니다.

사용하는 형식은 아래와 같습니다.

char 배열명[문자열길이]

 

예컨대 char str[12]는 배열명이 str이며 12 문자 길이를 가진 char형 배열입니다.

3. 배열 초기화

1) 배열 선언 후 초기값 할당

int array[4]; // 반드시 배열의 크기를 지정해야 함
	array[0] = 10;
    array[1] = 20;
    array[2] = 30;
    array[3] = 40;

2) 배열 선언과 동시에 초기값 할당

int array[4] = {10,20,30,40}; 
int array2[] = {10,20,30,40}; //배열의 크기 생략 가능
int array3[4] = {10,20,30, }; // array3[3] = 0으로 초기화 됨
//int array4[4] = {10, ,30,40}; // 에러 발생
//int array5[4] = {10,20,30,40,50}; // 에러 발생

3) 외부로부터 자료를 입력받아 초기화

 int x[10];

  for (int i = 0; i < 10; i++) {
    scanf("%d", &x[i]); //배열의 크기가 10이므로 10번의 입력을 받음
  }

4) 2차원 배열의 초기화

int array1[3][3] = {1,2,3,4,5,6,7,8,9};
int array2[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int array3[3][3] = {{1,2,3},
                    {4,5,6},
                    {7,8,9}};

5) 3차원 배열의 초기화

int c[2][3][4] = {{{1,2,3,4},{5,6,7,8},{9,10,11,12}},
                    {{13,14,15,16},{17,18,19,20},{21,22,23,24}}};

6) char형 배열의 초기화

char name[] = "kim zero week"; //문자열 단위로 초기화
char address[] = {'s','e','o','u','l','\0'}; // 문자 단위로 초기화 -> 반드시 \0 문자를 삽입해야 함

 

4. 기억공간 표현

1) 1차원 배열의 기억공간 표현

2) 2차원 배열의 기억공간 표현

3) 3차원 배열의 기억공간 표현

4) char형 배열의 기억공간 표현

 

5. 사용예시

1차원 배열의 사용예시1)

#include <stdio.h>
void main() {

  int array1[4] = {1, 2, 3, 4};
  int array2[] = {1,2,3,4};
  int array3[4] = {10,20};
  int array4[4] = {0};

  for(int i=0;i<4;i++) {
    printf("%d ", array1[i]); //출력: 1 2 3 4 
  };
  printf("\n");

  for(int i=0;i<4;i++){
    printf("%d ", array2[i]); //출력: 1 2 3 4 
  }
  printf("\n");
  for(int i=0;i<4;i++){
    printf("%d ", array3[i]); //출력: 10 20 0 0
  }
  printf("\n");
  for(int i=0;i<4;i++){
    printf("%d ", array4[i]); //출력: 0 0 0 0
  }
  printf("\n");
}

 

1차원 배열의 사용예시2)

#include <stdio.h>
void main() {

  static int x[] = {1,2,3,4};
  static int y[] = {10,20,30,40};

  int i,z[4];

  for(i=0;i<4;i++)
    z[i] = x[i]+y[3-i];
  printf("반대 위치의 배열 요소의 합\n");

  for(int i=0;i<4;i++)
    printf("%d+%d = %d\n",x[i],y[3-i],z[i]);
    //출력: 1+40 = 41
    //      2+30 = 32
    //      3+20 = 23
    //      4+10 = 14
}

 

2차원 배열의 사용예시1)

#include <stdio.h>
void main() {

 static int score[4][3] = {{90,90,90},
                          {80,80,80},
                          {70,70,70},
                          {60,60,60}};

  int sum,i,j;
  printf("번호\t국어\t수학\t영어\t합계\n");
  for(int i=0;i<4;i++){
    sum = 0;
    printf("%3d",i+1);
    for(int j=0;j<3;j++){
      printf("\t%3d",score[i][j]); 
      sum += score[i][j];
    }
    printf("\t%3d\n",sum);
  }
  //출력: 번호 국어 수학 영어 합계
  //      1    90  90  90  270
  //      2    80  80  80  240
  //      3    70  70  70  210
  //      4    60  60  60  180
}

 

char형 배열의 사용예시)

#include <stdio.h>
void main() {

  char name[] = "kim zero week"; //문자열 단위로 초기화
  char address1[6] = {'s', 'e', 'o', 'u', 'l', '\0'};
  char address2[6] = {'s', 'e', 'o', 'u', 'l'}; //\0이 없으면 마지막에 쓰레기값이 붙을 수도 있

  printf("\n name : %s", name); //출력: name : kim zero week
  printf("\n address1 : %s", address1); //출력: address1 : seoul
  printf("\n address2 : %s", address2); //출력: address2 : seoul
}

char형 배열의 사용예시2)

#include <stdio.h>
void main() {

  char string[50];

  int i =0;
  printf("문자열을 입력하세요:");
  scanf("%s",string);
  printf("입력받은 문자열: %s\n",string);
  printf("문자단위 출력:");
  while(string[i] != '\0'){ //scanf 함수 호출을 통해 입력받은 문자열의 끝에도 \0문자가 자동으로 삽입됨
    printf("%c",string[i]);
    i++;
  }
}

6. 배열을 함수의 매개변수로 사용했을 때

함수를 호출할 때 배열을 함수의 매개변수로 사용한다면 배열명만 명시하여 호출합니다.

예컨대 아래처럼 사용가능합니다.

int score[2][2] = {{1,2},{3,4}}일 때 score_sum()함수에서 매개변수로 사용한다면

score_sum(score);

이때 함수의 헤더에는 1차원 배열의 경우 크기 생략 가능하며, 다차원 배열의 경우 가장 높은 차원의 크기를 생략 가능합니다.

 

2차원 배열이 함수의 매개변수로 사용된 예시)

#include <stdio.h>
void score_sum(int gr[][5],int,int); //가장 높은 차원의크기를 생략
void main() {

  int score[2][5] = {{10,20,30,40,50},{60,70,80,90,100}};
  score_sum(score, 2, 5);
}

void score_sum(int gr[][5],int row, int col){ //가장 높은 차원의크기를 생략
  int sum[2] = {0};
  int i,j;
  for(i=0;i<row;i++){
    for(j=0;j<col;j++)
      sum[i] += gr[i][j];
    printf("sum[%d] = %d\n",i,sum[i]);
    //출력: sum[0] = 150
    //      sum[1] = 450
  }
}
  }
}

'C Programming > C' 카테고리의 다른 글

[C] 구조체  (0) 2024.05.31
[C] 포인터  (0) 2024.05.17
[C] 기억 클래스  (1) 2024.04.26
[C] 함수  (0) 2024.04.26
[C] goto문  (0) 2024.04.26