36.1 배열

13161 단어 C배열C

배열

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

배열 선언

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

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

#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;
}

  • 배열을 선언하면서 값을 초기화 할 때는 값 개수는 배열의 크기보다 작아도 되지만 크면 안된다.
  • { }를 사용하여 배열에 값을 할당하는 방법은 배열을 선언할 때만 사용할 수 있으며, 이미 선언된 배열에는 사용할 수 없다.

요소

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

배열[인덱스]

  • ⭐ 배열의 인덱스는 항상 0부터 시작한다. 따라서 배열 numArr의 첫 번째 요소는 numArr[0[이 된다.


참고) 배열 선언과 배열 인덱스

배열은 선언할 때도, 배열의 요소에 접근할 때도 [ ]를 사용한다.
같은 기호를 사용하지만 구분해서 생각해야 한다.
배열을 선언할 때 [ ]이 변수가 배열이고 크기는 얼마다라고 알려주는 역할이고, 배열을 사용할 때 [ ]배열의 요소에 접근하겠다는 뜻이다.


또한, 요소가 0개인 배열은 선언할 수 없다. 배열은 선언할 때 크기는 항상 1 이상이다. 하지만, 배열에 접근할 때 인덱스는 0부터 시작한다. 배열의 인덱스가 0부터 시작하는 이유는 메모리 주소가 0부터 시작하기 때문이다. ⭐⭐ 배열도 포인터이므로 인덱스가 0부터 시작하면 요소 접근과 포인터 연산이 일치하게 된다.


참고) 배열을 선언할 때 크기 생락하기

배열을 선언할 때 값을 초기화한다면 배열의 크기를 생략할 수 있다.
❗ 초기화를 하지 않을 때는 생략할 수 없다.

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

int numArr1[] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 };    // 배열의 크기 생략
int numArr2[];    // 컴파일 에러


요소에 값 할당하기

모든 요소 0으로 초기화

  • 배열의 모든 요소를 0으로 초기화 하려면 선언 시 { 0, }을 할당한다.
  • 0을 일일이 나열하지 않아도 모든 요소가 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;
}

배열의 요소에 값 할당하기

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

배열[인덱스] = 값;

#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;
}
  • 요소를 출력할 때와 마찬가지로 [ ]에 인덱스를 지정한 뒤 값을 할당하면 된다.

  • 배열의 범위를 벗어난 인덱스에 접근하면 배열이 아닌 다른 메모리 공간에 접근하게 된다.

#include <stdio.h>

int main()
{
    int numArr[10] = {11, 22, 33, 44, 55, 66, 77, 88, 99, 110};    // 크기가 10인 배열 선언
    
    printf("%d\n", numArr[-1]);    // 음수이므로 잘못된 인덱스
    printf("%d\n", numArr[10]);    // 배열의 범위를 벗어난 인덱스
    printf("%d\n", numArr[20]);    // 배열의 범위를 벗어난 인덱스

    return 0;
}

/* 
실행 결과
-858993460 (쓰레기 값)
-858993460 (쓰레기 값)
13651968   (쓰레기 값)
*/

⇨ 인덱스로 음수를 지정하거나, 배열의 크기를 벗어난 인덱스를 지정해도 컴파일 에러가 발생하지 않는다.
⇨ 하지만 실행 시 쓰레기 값이 출력된다.
⇨ 즉, 배열이 아닌 다른 메모리 공간에 접근한 것을 알 수 있다.

  • 따라서 배열의 범위를 벗어난 접근을 하여 값을 할당해버리면 엉뚱한 메모리에 값을 저장하게 되어 프로그램이 정상적으로 실행되지 않을 수 있다.


출처

https://dojang.io/mod/page/view.php?id=292
https://dojang.io/mod/page/view.php?id=293
https://dojang.io/mod/page/view.php?id=294
https://dojang.io/mod/page/view.php?id=295

좋은 웹페이지 즐겨찾기