C 프로그래밍/8. 배열

8.1 배열이란?, 배열의 초기화

Recircle 2019. 6. 18. 18:38

지금까지 학습하였던 변수는 하나의 값만을 저장할 수 있었지만, 배열을 이용하면 많은 값을 한꺼번에 저장이 가능합니다. 배열을 사용하면 한 번에 여러 개의 변수를 생성하는하고 이는 연속된 메모리 주소에 저장됩니다.



배열이 필요한 이유


학생이 10명이 있다고 가정하면, 10개의 변수가 필요한데,

1
int s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;
cs

이렇게 선언을 해야합니다.

그러나, 이러한 학생이 30명, 300명을 넘어간다고치면, 10000명을 넘어가면 프로그래머 생활이 아주 힘들어질껍니다.

이를 위해 탄생한 것이 배열이며, 배열을 이용하면 같은 종류의 대량의 데이터를 효율적이고 간편하게 처리할 수 있습니다.


배열 안에 들어있는 데이터는 정수로 되어 있는 번호에 의하여 접근됩니다.

1
int s[10];
cs

배열을 선언한겁니다. 저렇게 쳐주면 연속된 메모리 주소에 s[0]~s[9]까지 자동으로 생성됩니다.

이러한 배열에는 순차적인 번호가 부여되는데 이것을 인덱스라고합니다.



배열의 특징


- 배열은 메모리의 연속적인 공간에 저장된다. 

ex) s[0]과 s[1]은 실제 메모리에서도 서로 붙어있다.


- 관련된 데이터를 차레로 접근하여서 처리가 가능하다. 하나의 이름을 공유하고 번호만 다를 뿐이라면 편리하게 사용 가능해진다.




배열의 선언


배열을 사용하려면 먼저 배열을 선언하여햐 합니다. 배열 선언을 통하여 컴파일러에게 요소의 개수과 자료형이 무엇인지를 알려줍니다. 

1
int scores[10];
cs

배열 선언이 완료되었습니다. int형으로 scores라는 이름으로 10개의 요소를 선언하였습니다. 선언을 하면 메모리에는

1
scores[0],scores[1],scores[2],scores[3],scores[4],scores[5],scores[6],scores[7],scores[8],scores[9],
cs

이렇게 저장됩니다.


다양한 배열 선언으로 감을 잡아봅시다.


1
2
3
4
float cost[12]; // 12개의 float형 값을 가지는 배열 cost
char name[50]; // 50개의 char형 값을 가지는 배열 name
char src[10], dst[10//2개의 문자형 배열 src와 dst를 동시에 선언
int index, days[7//일반 변수 index와 배열 days를 동시에 
cs



주의사항


1. 배열의 크기는 꼭 지정해줘야합니다.

2. 배열의 크기를 변수로 할수는 없습니다.

3. 배열의 크기가 음수이면 안됩니다.

4. 배열의 크기가 실수이면 안됩니다.




배열 요소 접근


인덱스라는 번호를 사용하여 접근합니다.

예를 들어 scores배열에서 인덱스가 5인 요소에 접근하려면 scores[5]와같이 적어주면 됩니다.

1
scores[7= 4;
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//배열을 선언하고 배열 요소에 값을 대입하는 기초적인 예제부터 살펴보자.
 배열 요소를 차례대로 처리할 때 유용하게 사용되는 것이 for반복문이다.
 
#include <stdio.h>
int main()
{
    int i;
    int score[5];
    score[0= 10;
    score[1= 20;
    score[2= 30;
    score[3= 40;
    score[4= 50;
 
    for (i = 0; i < 5; i++)
    {
        printf("grade[%d]=%d\n", i, score[i]);
    }
    return 0;
}
cs

배열고 반복문

1
2
3
4
for (int i = 0; i < 5; i++)
{
    scores[i] = 0;
}
cs

이런식으로 반복문을 이용하여 배열에 값을 쉽게 넣을수도 있다.



인덱스의 범위

scores[5]라고 선언하였으면 사용할 수 있는 인덱스의 범위는 0~4까지이다. 이를 넘어가게되면 심각한 오류가 발생하니 주의 하여야한다.



배열의 초기화


배열을 초기화 하는 방법은 다음과 같다.


1
2
3
4
5
6
7
8
9
10
11
12
int scores[5]={10,20,30,40,50// 인덱스 0부터 4까지 순차적으로 저장된다.
 
int scores[5]={10,20,30// 인덱스 0부터 2까지 순차적으로 저장하고 나머지부분은 0으로 초기화한다. 
이를 이용해서 int scores[5]={0};//을 치게되면  0~4까지 모두 0으로 초기화하게된다.
 
int scores[]={10,20,30,40,50}; // 배열의 크기가 주어지지않을경우 최값의 개수가 배열의 크기가 된다.
 
int scores[5];             //인덱스 0~4까지 모두 쓰레기값이 들어간다.
 
 
 
 
cs



배열의 요소의 개수는 sizeof()를 통해서 가능하다.



배열의 복사


배열의 복사는 

1
2
int a[5]={12345};
int b[5];
cs

와 같이하면 복사되지않는다.

for반복문을 이용해서 인덱스마다 1개씩 일일이 복사해줘야한다.

1
2
3
4
5
6
7
int a[5]={12345};
int b[5];
 
for(i = 0; i < 5; i++)
{
    b[i] = a[i];
}
cs



배열의 비교


배열의 복사처럼 for문을 이용해서 하나씩 비교해줘야한다.

1
2
3
4
5
6
7
8
9
10
int a[5= { 1,2,3,5,4 };
int b[5= { 1,2,3,5,4 };
 
for ( i = 0; i < 5; i++)
{
    if (a[i]!=b[i])
    {
        printf("다름");
    }
}
cs





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
 
#define SEAT 10
 
int main()
{
    char inp1;
    int inp2, i;
    int seats[SEAT] = { 0 };
 
    while (1)
    {
        printf("좌석을 예약하시겠습니까? (y,n)");
        scanf("%c%*C"&inp1);
 
        if (inp1=='n')
        {
            break;
        }
 
        printf("===========================\n");
        for ( i = 1; i <= SEAT; i++)
        {
            printf(" %d", i);
        }
        printf("\n");
        printf("===========================\n");
 
        for ( i = 0; i < SEAT; i++)
        {
            printf(" %d", seats[i]);
        }
        printf("\n");
 
        printf("예약할 좌석을 입력해주세요.");
        scanf("%d"&inp2);
        if (seats[inp2-1]==0)
        {
            seats[inp2 - 1= 1;
            printf("예약되었습니다.");
        }
        else
        {
            printf("이미 예약된 좌석입니다.");
        }
 
        
    }
return 0;}
cs

한번 분석해보고 직접 컴파일 해보자.