배열[Array]
- 학생별 점수를 변수로 만들어야 한다고 하면
-
int score1, score2, score3 ...;
- -> 배열로 int score[3];
- 같은 종류의 변수를 한 묶음으로
1차원 배열의 선언과 초기화
{배열 내부 변수의 타입} {변수명}[크기];
int score[3];
char name[5];
float avg[4];
int scores[3] = {88, 91, 32};
scores[1] = 22;
...
배열의 인덱스[첨자]
{1, 2, 3, 4, 5}
- 값
2에 접근하기 위해서는 몇 번 인덱스를 사용해야 할까?
- 2? 아니다. 배열은 0부터 센다.
- 앞에서부터 0, 1, 2, 3, 4번째 요소다
왜 0부터 시작할까?
- 배열은 메모리에 ‘순서대로’ 저장된다.
- 빈 칸에 무작위로 저장하지 않고, 배열은
원소의 크기 × 원소 개수만큼의 연속된 메모리 공간을 사용한다.
-
int test[3] = {1, 2, 3}
Address: [0x1000, 0x1004, 0x1008]
Data: [ 1 , 2 , 3 ]
Index: [ 0 , 1 , 2 ]
- 조금 더 깊게 들어가보도록 하자.
- 배열의 각 원소 위치는 시작 위치와 원소 크기를 기준으로 계산 할 수 있음.
- 시작 주소가 0x1000이니 4바이트인 int는 0x1000~0x1003까지의 메모리를 사용한다.
- Int는 환경마다 크기가 다르기에, 본 문서에서는 4바이트로 가정한다.
- 즉 우리가 0번, 1번, 2번으로 세는 까닭은 원소의 주소 = 시작 주소 + (인덱스 × 원소의 크기)이기에
-
test[0] → 0x1000 + (0 × 4) = 0x1000
test[1] → 0x1000 + (1 × 4) = 0x1004
test[2] → 0x1000 + (2 × 4) = 0x1008
- 0번부터 시작한다는 것을 알 수 있다.
배열의 인덱스 범위와 N - 1
- 그렇다면 요소가 5개인 배열의 범위는?
- 0~4다. 인덱스는 항상 0부터 세니 N - 1까지가 범위인 것이다.
배열과 for문
int score[5] = {80, 90, 70, 100, 85};
for (int i = 0; i < 5; i++) {
printf("%d\n", score[i]);
}
- for는 지정된 횟수동안 반복하는데 주로 쓰이는 반복문이다.
- 그렇다면 배열의 인덱스 범위만큼만 반복시키면 배열과 함께 사용할 수 있지 않겠는가?
- i = 0에서 0번 인덱스부터 i < 5에서 4번 인덱스까지 score[i]에서 루프마다 다른 인덱스에서 접근.
자주하는 실수
배열 크기와 마지막 인덱스 혼동
int a[5];
a[5] = 10; // 잘못된 접근.
// 정상 범위
a[0] ~ a[4]
반복문에서의 조건문 실수
for (int i = 0; i <= 5; i++)
초기화 되지 않은 배열 사용
int a[5];
printf("%d", a[0]);
- 지역 배열의 경우 초기값이 보장되지 않음.
- 그래서
int a[5] = {0};
배열 전체 대입
int a[3];
a = {1, 2, 3}; // 불가능
int a[3] = {1, 2, 3};
과제