카메라 개발자 공부방(SW)

[11장] 배열 본문

Langauge/C

[11장] 배열

luckmart 2021. 9. 30. 19:25
반응형

오늘은 포인터에 이어서 배열에 대해 공부하겠습니다.

(배열과 포인터는 아주 밀접한 관계가 있기 때문에 포인터와 마찬가지로 집중해서 공부해야 될 부분입니다.)


자 그러면 배열은 무엇일까요?

배열은 연속된 메모리 공간을 의미하고, 선언해야 될 변수의 개수가 많을 때 사용됩니다.

 

선언해야 될 변수의 개수가 많은데, 변수를 일일이 선언하게 된다면 반복되는 코드가 많이 늘어나고 코드 관리가 어렵게 됩니다.

(코드는 가독성이 생명입니다.)

 

그래서 배열이 필요한 것입니다. 배열은 아래와 같이 선언할 수 있습니다.

dataType arrayName[size];

// example
int arr[5] = {};

 

arr이란 이름의 배열의 선언 됐고 data type은 int이며 5가개 선언됐다는 뜻입니다.

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    printf("%d\n", arr[0]);
    return 0;
}

// 실행결과
// 1

[] 연산자 굉장히 익숙하시죠? 익숙하시지 않다면 9장 변수와 주소를 보고 와주시기 바랍니다

[] 연산자 앞에는 주소가 온다고 누누이 말했죠? 눈치채셨겠지만 arr은 배열 메모리의 시작 주소를 의미합니다~! 
항상 배열의 첫 번째 주소를 가리킨다는 의미에서 포인터 상수라고도 부릅니다.

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    printf("%d %d\n", arr[0], *arr);
    return 0;
}

// 실행결과
// 1

int arr[5]의 메모리를 그림으로 살펴보겠습니다.

메모리 그림

 

int형 data type의 변수가 5개가 할당되었습니다. 메모리의 크기는 4byte × 5이니 20byte입니다.
배열의 시작 주소를 이용해 모든 요소에 접근할 수 있습니다.

[ ] 안의 정수를 인덱스라고 부릅니다.
(배열의 사이즈는 [] 안에 양의 정수를 넣어서 크기를 결정할 수 있고, 상수만 입력할 수 있습니다.

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    printf("arr size: %d\n", sizeof(arr));
    return 0;
}

// 실행결과
// arr size: 20

 

메모리의 구조는 선형적인 형태로 되어있습니다. 시작 주소를 알기 때문에 주소의 산술 연산으로 원하는 위치로 가서 메모리의 자체의 값을 읽어오고 변경시킬 수 있습니다.

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5};
    arr[3]= 400;
    int i = 0;
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}

// 실행결과
// 1 2 3 400 5

다음은 배열의 대입과 초기화에 대해서 이야기해보겠습니다.

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2, 3, 4, 5}; // { }를 이용해 초기화시킬 수 있습니다.
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

// 실행결과
// 1 2 3 4 5

배열의 초기화는 {}에 순차적으로 값을 입력하면 첫 번째 요소부터 차근차근 값이 할당됩니다. 

#include <stdio.h>

int main()
{
    int arr[5] = {1, 2} ;
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

// 실행결과
// 1 2 0 0 0

 

하지만 위와 같이 메모리 사이즈만큼 초기화되지 않으면, 나머지 부분은 0으로 채워집니다. 

#include <stdio.h>

int main()
{
    int arr[5];
    for (i = 0; i < 5; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

// 실행결과
// 쓰레기 값

변수와 마찬가지로 초기화하지 않으면 배열 메모리에는 쓰레기 값이 들어갑니다.
배열을 사용할 땐 항상 초기화를 한 후, 연산을 해야 합니다.

'Langauge > C' 카테고리의 다른 글

[13장] 포인터의 포인터(pointer of pointer)  (0) 2021.10.02
[12장] 포인터와 배열  (0) 2021.10.01
[10장] 포인터  (0) 2021.09.29
[9장] 변수와 주소  (0) 2021.09.28
[8장] 사용자 함수  (0) 2021.09.27
Comments