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

[24장] const 본문

Langauge/C

[24장] const

luckmart 2021. 10. 13. 21:37
반응형

오늘 배워볼 const란 변수 메모리를 상수화 시키는 연산자입니다.

다음의 코드를 보시죠

#include <stdio.h>

int main()
{
    const int n = 0;
    n  = 4;
}

// 실행결과
// compile error occur!

n이란 변수가 만들어졌지만, const에 의해서 상수화가 되었기 때문에 초기화 과정에서만 메모리에 데이터를 write 할 수 있습니다.
상수 메모리는 대입 연산이 되지 않습니다.

보통이  변수의 상수화는
1) 상수 목적으로 변수를 사용하는 경우나
2) 참조하는 메모리의 데이터를 read 만 한다면 그 때 사용됩니다.
(read 할 목적이라도 포인터 주소를 알고 있기 때문에 충분히 write 할 위험이 있습니다. 그것을 막는 것입니다.)

그리고 상수화 시키는 연산은 const도 있지만,

enum

define으로도 상수를 정의할 수 있습니다.

 

각각 무슨 차이가 있을 까요?

1) const는 상수화시키는 메모리 자체의 공간이 있습니다.

2) enum은 상수화 시키는 메모리 공간은 없고 값만 존재합니다.

3) define은 컴파일 시간에 값으로 치환됩니다.

#include <stdio.h>

void copy(int* dst, const int* src, int size)
{
    for (int i = 0; i < size; i++) {
        dst[i] = src[i];
    }
}

int main()
{
    const int MAX = 5;
    int arr[MAX] = {1, 2, 3, 4, 5};
    int arr2[MAX] = {0};

    copy(arr2, arr, MAX);

    for (int i = 0; i < size; i++) {
        printf("%d ", arr2[i]);
    }
}
// 실행결과
// 1 2 3 4 5

copy 함수에서 매개변수 src에서 의해 read 되는 메모리는 변경되지 않을 의도로 작성되었습니다.

하지만 프로그래머 실수?에의해 충분히 변경될 수 있는 가능성은 존재하기 때문에
const를 명시적으로 작성해서 이를 막는 것입니다. 이런 목적에서 const가 사용됩니다.

포인터 변수는 선언된 const의 위치에 따라 조금씩 기능이 달라집니다.

1) const int* pn = &n;

*pn은 참조하는 메모리 자체죠? *pn은 변경 불가하다는 뜻이고, pn은 변경 가능하다는 의미입니다.

2) int* const pn = &n;

*pn 변경 가능, pn 변경 불가

3) const int* const pn = &n;

*pn 변경 불가, pn 변경 불가

#include <stdio.h>

int main()
{
    int n = 10;
    int tmp = 100;
    const int* const pn1 = &n;
    const int* pn2 = &n;
    int* const pn3 = &n;

   *pn1 = 100;  // compile error
    pn1 = &tmp; // compile error

   *pn2 = 100;  // compile error
    pn2 = &tmp; // ok

   *pn3 = 100;  // ok
    pn3 = &tmp; // compile error
}

이해가 되시나요?

자 오늘은 여기까지!

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

[25장] main 함수의 인자전달  (0) 2021.10.18
[26장] 가변인자  (0) 2021.10.17
[23장] 파일 입출력  (0) 2021.10.12
[22장] 재귀함수  (0) 2021.10.11
[21장] 함수 포인터  (0) 2021.10.10
Comments