programming/C

C // 1차원배열

깨래 2017. 12. 18. 15:55

배열


예를들어, 어떤 아파트의 가구별 가족 수를 저장 및 갱신하는 프로그램을 만드는데 이를 코드로 만든다면

int main(void)

{

int floor101,floor102 ... ... floor303,floor304}

}

이렇게 변수가 무수히 많아지게 될 것이다. 이러한 상황에서 배열은 우리가 끔찍한 일을 겪지 않아도 되도록 편의를 제공해주는데 배열을 사용하면 그 수에 상관없이 한번에 많은 수의 변수를 선언할 수 있기 때문이다.


배열의 선언

int arr[5];


int 배열을 이루는 요수의 자료형

arr 배열의 이름

[5] 배열의 길이


int형 변수 5개는 메모리상에 나란히 선언이 된다.


ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    int arr[5];
    int sum=0,i;
    
    arr[0]=10, arr[1]=20, arr[2]=30, arr[3]=40, arr[4]=50;
    
    for(i=0;i<5;i++)
    {
        sum +=arr[i]
    }
    printf("배열 요소에 저장된 값의 합 : %d\n",sum);
    
    return 0;
}

cs

출력결과

배열 요소에 저장된 값의 합 : 150


6행에 배열의 0번째 인덱스에는 10, 1번째 인덱스에는 20, 2번째 인덱스에는 30... 이렇게 저장을 하고 있다.

8번행의 반복문으로 인해 배열 arr에 0번째부터 '순차적'으로 접근을 하여 그 값들을 sum에 저장하고 있다.


인덱스의 값은 0부터 시작하며 배열의 장점은 순차적 접근이 가능하다.!


배열은 선언과 동시에 초기화 할 수 있다. 

int arr1[5]={1,2,3,4,5};


배열의 길이정보를 생략하면 초기화리스트를 보고 컴파일러가 알아서 길이정보를 채워준다.

int arr2[ ]={1,2,3,4,5,6,7}; // int arr2[7]={1,2,3,4,5,6,7};


배열의 길이를 다 채울만큼의 초기값이 선언되지 않은 경우, 나머지 요소들은 0으로 채워진다.

int arr3[5]={1,2}; // 1,2,0,0,0


ex)

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
#include<stdio.h>
 
int main()
{
    int arr1[5]={1,2,3,4,5};
    int arr2[]={1,2,3,4,5,6,7};
    int arr3[5]={1,2};
    
    int ar1len,ar2len,ar3len,i;
    
    printf("배열 arr1의 크기:%d\n",sizeof(arr1));
    printf("배열 arr2의 크기:%d\n",sizeof(arr2));
    printf("배열 arr3의 크기:%d\n",sizeof(arr3));
    
    ar1len=(sizeof(arr1)/sizeof(int));
    ar2len=(sizeof(arr2)/sizeof(int));
    ar3len=(sizeof(arr3)/sizeof(int));
    
    for(i=0;i<ar1len;i++)
    {
        printf("%d",arr1[i]);
    }
    printf("\n");
   
    for(i=0;i<ar2len;i++)
    {
        printf("%d",arr2[i]);
    }
    printf("\n");
    
    for(i=0;i<ar3len;i++)
    {
        printf("%d",arr3[i]);
    }
    printf("\n");
    
    return 0;
}
 

cs

출력결과

배열 arr1 크기:20

배열 arr2 크기:28

배열 arr3 크기:20

12345

1234567

12000


15,16,17행은 배열의 길이를 계산하는 방법이다.

19, 25, 31 행의 반복문은 각 배열의 길이를 가지고, 0번째 인덱스부터 순차적으로 접근을 하는 것이다.


문자열


char str[14]="Good morning!";


위 문장처럼 배열에 문자열을 저장하면 길이가 14인 문자열이 생성이 된다.

문자의 길이는 분명 13이지만 14로 저장을 하는 이유는, 문자열의 끝을 표현하는 널(null)문자가 자동으로 들어가기 때문이다.

따라서 char형 배열을 선언할 경우에는 특수문자 '\0' 이 저장될 공간까지 고려해서 배열의 길이를 결정해야 한다.

다시 말해, 문자열의 끝을 표현하려면 공백문자가 있어야 한다.


ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h>
 
int main()
{
    char str[]="Good morning!";
    
    printf("배열 str의 크기:%d \n",sizeof(str));
    printf("널 문자 문자형 출력: %c \n",str[13]);
    printf("널 문자 정수형 출력: %d \n",str[13]);
    
    str[12]='?';    // 배열 str에 저장된 문자열 데이터 변경
    
    printf("문자열 출력:%s \n",str);
    
    return 0;
}
 

cs

출력결과

배열 str 크기:14        // 문자열의 길이정보가 생략되어 컴파일러가 문자열의 길이를 계산해서 배열의 길이를 결정하는데 출력되는 값은 14이다. 널문자도                                        포함되기 때문에

문자 문자형 출력:     

문자 정수형 출력: 0 

문자열 출력:Good morning? 


널문자가 공백으로 표현되었다고 공백문자가 아니다. 공백문자를 아스키 코드로 표현하면 32이지만 널문자는 0으로 표현이 된다. 그래서 이 둘은 같다고 생각하면 정말 큰 오산이다. 


scanf를 사용하여 문자열을 입력할 때, & 연산자를 사용하지 않는다.

ex)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
 
int main()
{
    char str[30];
    int idx=0;
    
    scanf("%s",str);    // 문자열을 입력받아 배열에 저장
    
    printf("%s \n",str);    // 문자열 출력
    
    while(str[idx]!='\0')
    {
        printf("%c",str[idx]);   // 문자열 문자단위 출력
        idx++;
    }
    
    return 0;
}
 

cs

출력결과

simple

simple 

simple


8행: 다른 자료형에는 &를 붙였지만, 문자열에는 붙이지 않는다.

12행 : 이 반복문으로 문자를 하나씩 출력하고 있다. 실행결과를 보면 scanf함수호출을 통해서 입력 받은 문자열의 끝에도 널 문자가 삽입되었음을 뜻한다.

C언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.


char arr1[ ] = {'H','i','~'};        // 널 문자가 없으므로 문자 배열

char arr2[ ] = {'H','i','~','\0'}; // 널 문자가 있으므로 문자열