[C언어] 배열 그리고 배열 초기화

ET의 공부/C언어|2020. 12. 29. 22:41

배열

배열(array)은 같은 데이터형을 가진 연속된 원소들로 구성됩니다. 배열을 선언하게 되면 그 배열이 몇 개의 원소를 가지고 있으며, 원소들의 데이터형이 무엇인지 컴파일러에게 알려주게 됩니다

배열 선언의 예를 알아보겠습니다.

//배열 선언 예.
int i_arr[5]; //5개의 int형 배열 선언
char c_arr[10]; //10개의 char형 배열 선언
float f_arr[123]; //123개의 float형 배열 선언

 

 

배열은 보통 변수들이 가질 수 있는 자료형을 갖습니다. 배열의 이름 앞에 사용할 자료형을 선언해주어야 합니다.

-(자료형) 배열 이름

그리고 각괄호[] 안의 수는 선언할 배열의 원소 크기를 나타냅니다. 그리고 배열은 첨자 번호 인덱스를 이용하여 각각의 원소에 접근할 수 있습니다. 인덱스는 0부터 시작하게 되므로 그림에서 선언한 배열의 첫 번째 원소는 arr [0]이 됩니다. 따라서 6번째 배열의 원소는 arr [5]로 접근할 수 있습니다.

 

배열의 초기화

배열을 초기화 하기전에 선언한 배열의 내부를 살펴보겠습니다.

 

#include <stdio.h>
#define arrSIZE 6
int main () {
    int i_arr[6]; //배열의 선언
    //배열값 출력//
    for(int i = 0; i<arrSIZE; i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}

//실행결과
//0번째 원소: 0
//1번째 원소: 0
//2번째 원소: 0
//3번째 원소: 0
//4번째 원소: -272632344
//5번째 원소: 32766

 

배열을 초기화 하지않는다면( 나중에 자료를 저장할 목적으로 사용한다면 필요 없겠지만) 배열이 차지하고 있는 메모리의 아무 값(어떤 값)을 자신의 값으로 사용하게 됩니다.

 

 

 

배열도 여타 다른 변수와 마찬가지로 초기화하여 사용이 가능합니다. 일반적인 변수는 아래와 같이 초기화 합니다.

 

//일반적인 변수의 초기화
int year = 2020;
float pi = 3.14;

 

배열의 초기화는 중괄호{} 안의 리스트의 값으로 초기화합니다.

 

//배열의 초기화
int i_arr[6] = {1,2,3,4,5,6};

 

배열을 초기화했으니 그 값을 확인해보겠습니다.

 

#include <stdio.h>
#define arrSIZE 6
int main () {
    int i_arr[6] ={1,2,3,4,5,6}; //배열의 선언
    //배열값 출력//
    for(int i = 0; i<arrSIZE; i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}
//실행결과
//0번째 원소: 1
//1번째 원소: 2
//2번째 원소: 3
//3번째 원소: 4
//4번째 원소: 5
//5번째 원소: 6

 

초기값으로 설정한 {1,2,3,4,5,6}이 제대로 들어간 것을 확인할 수 있습니다. 일반적으로 배열의 원소의 값과 초기값 리스트의 개수는 일치해야 합니다. 그럼 서로 다를 경우 어떻게 될까요?

 

배열의 선언된 원소의 값보다 초기값이 더 클경우(많을 경우)

 

#include <stdio.h>
#define arrSIZE 6
int main () {
    int i_arr[6] ={1,2,3,4,5,6,7,8}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열값 출력//
    for(int i = 0; i<arrSIZE; i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}
//Excess elements in array initializer 에러 코드 발생

 

실행은 될지라도(컴파일러에 따라) 원소의 크기가 배열의 크기보다 크다는 Excess elements in array initializer가 발생합니다. 그런데 배열 원소의 크기를 선언하지 않고 초기화를 하면 새로운 결과가 나타납니다.

 

배열의 선언된 원소의 값보다 초기값이 더 클경우(많을 경우) - 배열 원소[]를 선언하지 않고 실행

 

#include <stdio.h>

int main () {
    int i_arr[] ={1,2,3,4,5,6,7,8}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열값 출력//
    for(int i = 0; i<sizeof(i_arr)/sizeof(i_arr[0]); i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}
//실행 결과
//0번째 원소: 1
//1번째 원소: 2
//2번째 원소: 3
//3번째 원소: 4
//4번째 원소: 5
//5번째 원소: 6
//6번째 원소: 7
//7번째 원소: 8

 

배열의 개수를 선언하지 않고 사용하면 컴파일러는 초기값 리스트{}에 있는 개수(크기)를 갖는 배열을 만듭니다. 다음은 반대로 선언한 배열의 크기가 초기값의 크기(개수) 보다 클 때를 알아보겠습니다.

 

배열의 선언된 원소의 값보다 초기값이 더 작을 경우

 

#include <stdio.h>
#define arrSIZE 6
int main () {
    int i_arr[arrSIZE] ={1,2,3}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열값 출력//
    for(int i = 0; i<arrSIZE; i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}
//실행 결과
//0번째 원소: 1
//1번째 원소: 2
//2번째 원소: 3
//3번째 원소: 0
//4번째 원소: 0
//5번째 원소: 0

 

이번에는 초기화한 {1,2,3}을 제외하고는 0으로 초기화된 것을 확인할 수 있습니다. 이를 응용하여 배열을 모두 0으로 초기화할 수 있습니다.

 

배열의 모든 원소를 0으로 초기화하는 방법

 

#include <stdio.h>
#define arrSIZE 100
int main () {
    int i_arr[arrSIZE] ={0}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열값 출력//
    for(int i = 0; i<arrSIZE; i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}
//실행 결과
//0번째 원소: 0
//1번째 원소: 0
//2번째 원소: 0
//3번째 원소: 0
//4번째 원소: 0
//...
//95번째 원소: 0
//96번째 원소: 0
//97번째 원소: 0
//98번째 원소: 0
//99번째 원소: 0

 

100개의 배열을 선언했지만 {0} 하나만으로 모두 0으로 초기화된 것을 볼 수 있습니다.

 

 

배열 지정 초기화

그럼 50개의 원소를 갖는 배열의 3번째 원소만 3이라는 값을 갖고 나머지는 0으로 초기화하려면 어떻게 해야 할까요?

{0,0,3}으로 초기화하는 방법이 있지만 3번째가 아닌 48번째 원소만 바꾼다면 {0..... 3}으로 초기화해야 할까요? 여기서는 지정 초기화에 대해 알아보겠습니다.

 

//배열의 지정 초기화
int arr[50] = {[3]=3}; 3번째 원소만 3으로 초기화, 나머지는 0으로

 

예제를 통해 자세히 알아보겠습니다.

 

#include <stdio.h>
#define arrSIZE 50
int main () {
    int i_arr[arrSIZE] ={[48] =3}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열값 출력//
    for(int i = 0; i<arrSIZE; i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}
//실행결과
//...
//46번째 원소: 0
//47번째 원소: 0
//48번째 원소: 3
//49번째 원소: 0

 

이를 더 응용해보겠습니다. [25] = 25라고 초기화하면 [25] 원소에만 25라는 값이 쓰일 것입니다. 그러면 

{[25=25,26,27}로 초기화한다면 어떤 결과가 나올까요?

 

#include <stdio.h>
#define arrSIZE 50
int main () {
    int i_arr[arrSIZE] ={[25] =25,26,27}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열값 출력//
    for(int i = 0; i<arrSIZE; i++){
        printf("%d번째 원소: %d\n",i,i_arr[i]);
    }
    return 0;
}
//실행결과
//23번째 원소: 0
//24번째 원소: 0
//25번째 원소: 25
//26번째 원소: 26
//27번째 원소: 27
//28번째 원소: 0
//29번째 원소: 0

 

예상과 맞게 [25]의 값부터 25,26,27이 써진 것을 볼 수 있습니다.

 

배열에 값 대입

초기화 말고 원하는 원소에 값을 대입할 수도 있습니다.

 

i_arr[4] = 100; //i_arr[4]에 100을 대입
#include <stdio.h>
#define arrSIZE 50
int main () {
    int i_arr[arrSIZE] ={0}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열에 값 대입//
    i_arr[4] = 100;
    printf("i_arr[4]의 원소값: %d\n",i_arr[4]);

    return 0;
}
//실행 결과
//i_arr[4]의 원소값: 100

 

배열 인덱스를 사용하여 개별적인 원소에 값을 대입할수 있습니다. 이를 이용하여 짝수의 인덱스에만 해당 인덱스만큼의 값이 들어있는 배열을 만든다면

// 전체를 0으로 초기화

// for문을 이용하여 짝수 인덱스에만 값을 대입

의 과정을 거치게 됩니다.

 

#include <stdio.h>
#define arrSIZE 50
int main () {
    int i_arr[arrSIZE] ={0}; //배열의 선언 배열의 원소 크기보다 많은 양을 초기화 시켰다.
    //배열에 값 대입//
    for(int i = 0; i<arrSIZE;i++){
        if(i%2 == 0){
            i_arr[i] = i;
        }
        printf("i_arr[%d]의 원소값: %d\n",i,i_arr[i]);
    }

    return 0;
}
//실행 결과
//i_arr[0]의 원소값: 0
//i_arr[1]의 원소값: 0
//i_arr[2]의 원소값: 2
//i_arr[3]의 원소값: 0
//i_arr[4]의 원소값: 4
//i_arr[5]의 원소값: 0
//i_arr[6]의 원소값: 6
//i_arr[7]의 원소값: 0
//i_arr[8]의 원소값: 8
//i_arr[9]의 원소값: 0
//i_arr[10]의 원소값: 10

 

댓글()