46. 배열 선언문

C언어에서 배열을 선언할 때 컴파일러에게 선언하는 것이 배열임을 알려주는 [ ]지시 연산자를 사용해요.
포인터를 선언할 때는 포인터임을 알려주는 * 지시 연산자를 사용해요.

배열을 선언하려면 컴파일러에게 선언하는 것이 배열임을 알려주는 [ ]지시 연산자 내부에 원소 개수를 지정하세요.
그리고 배열 이름과 지시 연산자, 원소 개수를 제외한 나머지 부분이 원소 형식이예요.
포인터도 변수 이름과 지시 연산자를 제외한 나머지 부분이 원소 형식이죠.

int arr[10]; //배열 선언문, 원소 개수:10, 원소 형식: int
int *p = arr; //포인터 선언문, 원소 형식: int

int arr[10]; 구문은 원소 형식이 int 이고 원소 개수가 10인 배열 arr을 나타내는 선언문이예요.
컴파일러는 int 형식의 메모리 크기 X 원소 개수의 메모리를 할당하고 배열명은 할당한 메모리 주소를 의미한답니다.
즉 배열명은 첫 번째 원소의 메모리 주소를 의미하여 int 형식의 포인터 상수처럼 사용할 수 있어요.

배열을 선언할 때는 여러 개의 원소의 값을 지정할 수 있어요.
배열 선언문에서 초기값을 지정하려면 { } 연산자에 초기값을 콤마로 구분하여 나열하세요.
그리고 초기값을 지정하지 않은 멤버는 컴파일러가 0으로 초기화 해 준답니다.
주의할 사항은 배열 선언문에서 초기값을 지정하지 않았을 때는 초기화해 주지 않는다는 거예요.

int arr1[5]={1,2}; //int arr1[5]={1,2,0,0,0};과 같은 표현
char arr2[10]; //배열 선언문, 원소 개수:10, 원소 형식: char, 각 원소의 값은 쓰레기 값
int arr3[5]={1,2}; //int arr4[5]={1,2,0,0,0};과 같은 표현

그리고 배열을 선언하면서 초기화 구문을 사용하면 원소 개수를 나타내지 않을 수 있어요.
이 때는 초기화한 개수가 원소 개수가 되요.
하지만 명확하게 원소 개수를 지정하는 것이 프로그램의 논리적 버그를 줄일 수 있는 좋은 습관이예요.
그리고 배열은 컴파일 시점에 메모리 크기를 결정하여 동작 중에 배열의 크기를 바꿀 수 없어요.
만약 크기를 중간에 바꾸길 원하면 동적 메모리 할당을 사용하세요.
책의 뒷 부분에서 동적 메모리 할당은 배울거예요.

int arr3[]= {1,2,3}; //배열 선언문, 원소 개수: 3 (초기값을 지정한 개수), 원소 형식 int

◈ 배열의 초기화 예

#include <stdio.h>
int main()
{
    int arr1[4]={1,2};
    int arr2[4];
    int index = 0;
    for(index = 0; index<4; index++)
    {
        printf("arr1[%d]: %d\n",index, arr1[index]);
    }
    for(index = 0; index<4; index++)
    {
        printf("arr2[%d]: %d\n",index, arr2[index]);
    }
    return 0;
}

◈ 실행 결과

arr[0]: 1
arr[1]: 2
arr[2]: 0
arr[3]: 0
arr2[0]: -858993460 (의미없는 쓰레기 값임)
arr2[1]: -858993460 (의미없는 쓰레기 값임)
arr2[2]: 858993460 (의미없는 쓰레기 값임)
arr2[3]: 858993460 (의미없는 쓰레기 값임)

◈ 기본 연습 (정답 바로가기)
1. 한 학생의 국어 성적, 영어 성적, 수학 성적을 관리하는 배열을 선언하세요.
그리고 초기값으로 국어 성적은 80, 영어 성적은 60, 수학 성적은 90으로 지정하고 각 원소의 값을 출력하세요.

2. 다음의 출력 결과를 예측하시오.

#include <stdio.h>
int main()
{
    int arr[10]={1};
    int index = 0;
 
    for(index = 0; index<10; index++)
    {
        printf("%d\n",arr[index]);
    }
    return 0;
}

3. 세 학생의 국어 성적, 영어 성적, 수학 성적을 관리하는 배열을 선언하세요.
그리고 세 명의 성적을 입력받아 과목별 합계와 평균을 출력하시오.
그리고 학생별로 합계와 평균을 출력하시오.