공부/C언어

C언어 - (9) : 1차원 배열

BKM 2024. 10. 15. 16:52

배열(Array)

여러개의 값을 선언해야할 경우에 일일이 변수를 지정해 값을 대입하는 것은 번거로울 수 있기 때문에, 다수의 변수 선언을 용이하게 하기 위한 용도로 '배열'이 사용된다.

 

배열은 그 형태에 따라 1차원 배열, 2차원 배열 등의 형태로 선언 가능하다.

1차원 배열

1차원 배열을 선언하는 규칙은 다음과 같다.

int arr_1d [4];
// int : 배열에 들어가는 데이터의 자료형
// arr_1d : 배열의 이름
// [4] : 배열의 크기(길이)

이렇게 생성된 배열은 index를 활용해 배열 안의 원소에 접근이 가능하다.

위의 예시처럼 배열의 크기가 4인 경우에는, 0~3까지의 index로 원소에 접근 가능하다.

int arr[4] = {1,2,3,4}; // 선언과 동시에 초기화

위의 경우처럼 일반 변수처럼 선언과 동시에 초기화 하는 것도 가능하며,

int arr[4] = {1,2}; // 일부만 초기화

// arr = {1,2,0,0}

이처럼 배열의 전체가 아닌 일부만 초기화시키는 경우, 명시되지 않은 부분은 0으로 값이 초기화된다.

int arr[] = {1,2,3,4};
// 배열의 크기가 선언되지 않은 경우

또한, 배열의 크기를 선언하지 않고 그 값만을 명시에 초기화 해준다면 컴파일러가 초기화 값에 맞춰 자동으로 배열의 크기를 지정해준다.

예제

#include <stdio.h>
int main(void)
{
    int arr1[5] = {1,2,3,4,5};
    int arr2[] = {1,2,3,4,5,6,7};
    int arr3[5] = {1,2};
    int arr1_len, arr2_len, arr3_len, i;

    // 배열의 전체 메모리 크기 계산
    printf("arr1의 크기 %d \n", sizeof(arr1));
    printf("arr2의 크기 %d \n", sizeof(arr2));
    printf("arr3의 크기 %d \n", sizeof(arr3));

    // sizeof : unsigned long(%lu)이 기본, int(%d)도 사용은 가능
    // 배열의 크기(길이)구하는 법 : 배열의 전체 메모리 / 자료형 메모리
    arr1_len = sizeof(arr1)/sizeof(int);
    arr2_len = sizeof(arr2)/sizeof(int);
    arr3_len = sizeof(arr3)/sizeof(int);

    for (i=0; i<arr1_len; i++)
        printf("%d ", arr1[i]);
    printf("\n");

    for (i=0; i<arr2_len; i++)
        printf("%d ", arr2[i]);
    printf("\n");

    for (i=0; i<arr3_len; i++)
        printf("%d ", arr3[i]);
    printf("\n");

    return 0;
}

/* output
arr1의 크기 20 
arr2의 크기 28 
arr3의 크기 20 
1 2 3 4 5 
1 2 3 4 5 6 7 
1 2 0 0 0 
*/

배열을 활용한 문자열의 저장

배열 안에 수치형 데이터만을 저장하는 것이 아니라 문자 데이터 역시 저장이 가능하다.

그리고 여러 문자가 합쳐진 문자열에 대해서도 배열을 활용해 저장이 가능한데, 저장하는 방식은 앞서 설명했던 것과 차이가 없지만

문자열의 경우에는 문자열의 끝에 '널 문자(\0)'가 삽입되기 때문에 이 점을 주의해야 한다.

char str[14]="Good morning!";
// str = {G,o,o,d, ,m,o,r,n,i,n,g,!,\0}
#include <stdio.h>

int main(void)
{
    char str[] = "Good morning!";
    printf("str의 크기: %lu \n", sizeof(str));
    printf("Null 문자 문자형 출력: %c \n", str[13]);
    printf("Null 문자 정수형 출력: %d \n", str[13]);

    str[12]='?'; // 배열 안의 데이터 변경
    printf("문자열 str 출력: %s \n", str);
    return 0;
}

/*output
str의 크기: 14 
Null 문자 문자형 출력:  
Null 문자 정수형 출력: 0 
문자열 str 출력: Good morning? 
*/

Null문자('\0')와 공백문자(' ') 모두 문자형(%c)으로 출력했을 경우에는 ' '의 출력 형태를 갖지만, 

ASCII코드인 정수형(%d)으로 출력했을 경우에는 각각 0, 32의 값을 갖기 때문에 서로 다른 문자 데이터인 것을 알 수 있다.

문자열의 입력(scanf)

다른 데이터를 입력하는 것 처럼 `scanf`를 활용해 문자열 역시 입력할 수 있으며, 이 떄 서식문자`%s`를 활용한다.

또한, 배열에 대한 정보를 입력받을 때에는 배열 이름앞에 '&'를 붙이지 않는다.

 

추가적으로 `scanf`함수는 공백을 기준으로 데이터의 수를 구분한다. 따라서 공백을 포함하는 문자열의 경우에는 한번의 `scanf`함수의 호출만으로

문자열 전체를 읽어들이지 못한다.

#include <stdio.h>

int main(void)
{
    char str[50];
    int idx=0;

    printf("문자열 입력: ");
    scanf("%s", str); // 문자열 입력 받기
    printf("입력 받은 문자열 : %s \n", str);

    printf("문자 단위 출력: ");
    while (str[idx])
    {
        printf("%c", str[idx]);
        idx++;
    }
    printf("\n");
    return 0;

}

/*output
문자열 입력: He is my friend
입력 받은 문자열 : He 
문자 단위 출력: He
*/