profile image

L o a d i n g . . .

Unit 36. 배열 사용하기

배열은 같은 자료형의 변수를 일렬로 늘어놓은 형태이며 반복문과 결합하면 연속적이고 반복되는 값을 손쉽게 처리할 수 있다.

 

 

36.1 배열을 선언하고 요소에 접근하기

배열은 변수 이름 뒤에 [ ] (대괄호)를 붙인 뒤 크기를 설정한다. 그리고 배열을 선언하면서 값을 초기화할 때는 { } (중괄호)를 사용한다.

 - 자료형 배열이름[크기];

 - 자료형 배열이름[크기] = { 값, 값, 값 };

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 배열을 생성하고 값 할당

    printf("%d\n", numArr[0]);    // 11: 배열의 첫 번째(인덱스 0) 요소 출력
    printf("%d\n", numArr[5]);    // 66: 배열의 여섯 번째(인덱스 5) 요소 출력
    printf("%d\n", numArr[9]);    // 110: 배열의 열 번째(인덱스 9) 요소 출력

    return 0;
}

int numArr[10]은 크기가 10 int형 배열을 선언한다는 뜻이다. 

배열에 값이 저장된 공간은 요소(element)라고 한다. 배열에서 각 요소에 접근하려면 배열 뒤에 [ ] (대괄호)를 사용하며 [ ] 안에 각 요소의 인덱스를 지정해주면 된다.

 

여기서 주의할 점은 배열의 인덱스는 항상 0부터 시작한다는 점이다. 따라서 배열 numArr의 첫 번째 요소는 numArr[0]이 된다.

 

※ 배열을 선언할 때 값을 초기화한다면 배열의 크기를 생략할 수 있다.

  • 자료형 배열이름[] = { 값, 값, 값 };

 

36.2 배열을 0으로 초기화하기

 - 자료형 배열이름[크기] = { 0, };

#include <stdio.h>

int main()
{
    int numArr[10] = { 0, };      // 배열의 요소를 모두 0으로 초기화

    printf("%d\n", numArr[0]);    // 0: 배열의 첫 번째(인덱스 0) 요소 출력
    printf("%d\n", numArr[5]);    // 0: 배열의 여섯 번째(인덱스 5) 요소 출력
    printf("%d\n", numArr[9]);    // 0: 배열의 열 번째(인덱스 9) 요소 출력

    return 0;
}

배열을 선언할 때 { 0, }을 할당하여 배열의 요소를 모두 0으로 초기화할 수 있다. 이렇게 하면 초기화할 때 0을 일일이 나열하지 않아도 된다.

 

 

36.3 배열의 요소에 값 할당하기

배열은 [ ]로 요소에 접근한 뒤 값을 할당할 수 있다.

 - 배열[인덱스] = 값;

#include <stdio.h>

int main()
{
    int numArr[10];     // 크기가 10인 배열 선언
    
    numArr[0] = 11;     // 인덱스가 0인 배열의 요소에 값 할당
    numArr[1] = 22;     // 인덱스가 1인 배열의 요소에 값 할당
    numArr[2] = 33;     // 인덱스가 2인 배열의 요소에 값 할당
    numArr[3] = 44;     // 인덱스가 3인 배열의 요소에 값 할당
    numArr[4] = 55;     // 인덱스가 4인 배열의 요소에 값 할당
    numArr[5] = 66;     // 인덱스가 5인 배열의 요소에 값 할당
    numArr[6] = 77;     // 인덱스가 6인 배열의 요소에 값 할당
    numArr[7] = 88;     // 인덱스가 7인 배열의 요소에 값 할당
    numArr[8] = 99;     // 인덱스가 8인 배열의 요소에 값 할당
    numArr[9] = 110;    // 인덱스가 9인 배열의 요소에 값 할당

    printf("%d\n", numArr[0]);    // 11: 배열의 첫 번째(인덱스 0) 요소 출력
    printf("%d\n", numArr[5]);    // 66: 배열의 여섯 번째(인덱스 5) 요소 출력
    printf("%d\n", numArr[9]);    // 110: 배열의 열 번째(인덱스 9) 요소 출력

    return 0;
}

배열의 요소를 출력할 때와 마찬가지로 [ ]에 인덱스를 지정한 뒤 값을 할당하면 된다.

 

 

36.4 배열의 크기 구하기

배열의 크기(요소 개수)는 배열이 차지하는 전체 공간에서 자료형의 크기로 나눠주면 된다.

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열

    printf("%d\n", sizeof(numArr));                  // 40: 4바이트 크기의 요소가 10개이므로 40
    printf("%d\n", sizeof(numArr) / sizeof(int));    // 10: 배열의 크기를 구할 때는
                                                     // 전체 공간을 요소의 크기로 나눠줌

    return 0;
}

배열에 sizeof 연산자를 사용해보면 배열이 차지하는 전체 공간이 출력된다. 따라서 int numArr[10];은 크기가 4바이트인 int형 요소가 10개 모여있으므로 40이 출력된다.

그리고 그것을 자료형의 크기로 나눠주면 배열의 크기가 나온다.

 

※ C 언어는 인덱스가 배열의 범위를 벗어났는지 검사하지 않으므로 이 부분을 생각하면서 작성해야 한다.

배열의 크기(요소 개수)를 구해놓고, 배열에 접근하기 전에 인덱스가 요소 개수 - 1을 넘지 않는지 확인하는 것도 좋은 방법이다.

 

 

36.5 반복문으로 배열의 요소를 모두 출력하기

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열

    for (int i = 0; i < sizeof(numArr) / sizeof(int); i++)    // 배열의 요소 개수만큼 반복
    {
        printf("%d\n", numArr[i]);    // 배열의 인덱스에 반복문의 변수 i를 지정
    }

    return 0;
}

반복문의 변수 i는 변화식을 통해 1씩 증가하므로 배열의 인덱스에 i를 넣으면 배열의 요소를 순서대로 모두 접근할 수 있다. 위와 비슷하게 반복문으로 배열의 요소를 역순으로 출력할 수도 있다.

 

 

36.6 배열의 요소 합계 구하기

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열
    int sum = 0;    // 합을 저장할 변수는 0으로 초기화

    for (int i = 0; i < sizeof(numArr) / sizeof(int); i++)    // 배열의 요소 개수만큼 반복
    {
        sum += numArr[i];    // sum과 배열의 요소를 더해서 다시 sum에 저장
    }

    printf("%d\n", sum);    // 605

    return 0;
}

배열의 요소 개수만큼 반복하면서 변수 sum과 요소를 더한 뒤 다시 sum에 저장해준다. 즉, 요소의 값을 sum에 누적시킨 다음 반복문 밖에서 sum을 출력한다.

 

 

36.8 배열을 포인터에 넣기

배열은 사실 첫번째 요소의 주솟값이기 때문에 포인터에 넣을 수 있다. 따라서 다음과 같이 포인터에 배열을 넣은 뒤 포인터에서 인덱스로 요소에 접근할 수 있다.

#include <stdio.h>

int main()
{
    int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 크기가 10인 int형 배열

    int *numPtr = numArr;       // 포인터에 int형 배열을 할당

    printf("%d\n", *numPtr);    // 11: 배열의 주소가 들어있는 포인터를 역참조하면 배열의 
                                // 첫 번째 요소에 접근

    printf("%d\n", *numArr);    // 11: 배열 자체를 역참조해도 배열의 첫 번째 요소에 접근

    printf("%d\n", numPtr[5]);  // 66: 배열의 주소가 들어있는 포인터는 인덱스로 접근할 수 있음

    printf("%d\n", sizeof(numArr));    // 40: sizeof로 배열의 크기를 구하면 배열이 메모리에 
                                       // 차지하는 공간이 출력됨

    printf("%d\n", sizeof(numPtr));    // 4 : sizeof로 배열의 주소가 들어있는 포인터의 크기를 
                                       // 구하면 포인터의 크기가 출력됨(64비트라면 8)

    return 0;
}

int *numPtr = numArr;처럼 배열을 포인터에 바로 할당할 수 있다. 단, 자료형이 같아야 하며 1차원 배열이라면 *가 한 개인 단일 포인터라야 한다.

 

배열을 포인터에 할당한 뒤 포인터를 역참조해보면 배열의 첫 번째 요소의 값이 나온다. 마찬가지로 배열 자체도 역참조해보면 배열의 첫 번째 요소의 값이 나온다. 즉, 실제로는 배열도 포인터라 할 수 있다.

 

+ 배열의 주소가 들어있는 포인터는 인덱스를 통하여 요소에 접근할 수 있다.

printf("%d\n", numPtr[5]);    // 66: 배열의 주소가 들어있는 포인터는 인덱스로 접근할 수 있음

 

복사했습니다!