카테고리 없음

[C/C++] const 개념, 특징, 사용법 (포인터)

security21 2026. 3. 13. 12:25

C언어에서 const는 변수의 값을 변경할 수 없도록 만드는 키워드

즉, 읽기 전용(Read Only) 변수를 만들 때 사용한다.

 

const를 사용하면 프로그램에서 실수로 값이 변경되는 것을 방지할 수 있기 때문에 안정적인 코드를 작성할 수 있다

 

1. const 개념

const = 상수

한번 값이 초기화되면 프로그램 실행 중에 값을 변경할 수 없다

 

기본 문법

const 자료형 변수명 = 값;

 

예제

#include <stdio.h>

int main() {

    const int num = 10;

    // num = 20;  // 오류 발생

    printf("%d", num);

    return 0;
}

 

만약 cosnt로 변수를 저장한 후 num의 값을 다시 변경하려 하면 num은 상수 변수이기 때문에 컴파일 오류가 발생한다

 

2. const를 사용하는 이유

const는 프로그램의 안정성과 가독성을 높이기 위해 사용

 

1. 값 변경 방지

프로그램 실행 중 중요한 값이 변경되는 것을 방지한다

 

const float PI = 3.14;

 

원주율은 변하면 안 되는 값이기 때문에 const로 선언

 

2. 코드 가독성 향상

const를 사용하면 해당 변수는 절대 변하지 않는 값이라는 것을 바로 알 수 있다

 

const int MAX_STUDENT = 30;

 

코드 보는 사람이 

이 값은 변하지 않는 값이구나~ 라고 이해할 수 있다

 

3. const 변수 특징

1. 값 변경 불가

초기화 후 값 변경 불가능

 

2. 읽기 전용 변수

읽기는 가능하지만 수정 불가

 

3. 반드시 초기화

선언 시 초기화하는 것이 일반적

 

const int a = 5;
printf("%d", a);

 

 

4. const와 포인터

C언어에서 const는 포인터와 함께 사용할 때 의미가 달라짐!!!!!!!!!

 

1. 포인터가 가리키는 값이 상수

const int *p;

 

포인터가 가리키는 값은 변경 할 수 XXXXXXX

#include <stdio.h>

int main() {

    int a = 10;
    int b = 20;

    const int *p = &a;

    // *p = 30;  // 오류

    p = &b;     // 가능

    return 0;
}

 

즉, 값 변경은 불가능하지만 주소 변경은 가능하다

 

2. 포인터 자체가 상수

int * const p;

 

이 경우엔 포인터의 주소를 변경할 수 없다!!!!!!

int a = 10;
int b = 20;

int * const p = &a;

*p = 30;   // 가능
p = &b;    // 오류

 

 

포인터 자체가 상수일 땐, 값 변경이 가능하지만 주소 변경은 불가능함

 

3. 둘 다 상수

const int * const p

 

값 변경, 주소 변경 둘다 XXXXXXXXXXX

int a = 10;

const int * const p = &a;

// *p = 20;  오류
// p = &b;   오류

 

 

*** const 포인터 종류 ***

#include <stdio.h>

int main() {

    int a = 10;
    int b = 20;

    /* 값이 상수 (값 변경 불가) */
    const int *p1 = &a;

    /*포인터가 상수 (주소 변경 불가) */
    int * const p2 = &a;

    /* 값도 상수 + 포인터도 상수 */
    const int * const p3 = &a;


    printf("초기값\n");
    printf("a = %d\n", a);


    /* p1 : 값 변경 불가, 주소 변경 가능 */
    p1 = &b;     // 가능
    // *p1 = 50; // 오류


    /* p2 : 값 변경 가능, 주소 변경 불가 */
    *p2 = 30;    // 가능
    // p2 = &b;  // 오류


    /* p3 : 값 변경 불가, 주소 변경 불가 */
    // *p3 = 40; // 오류
    // p3 = &b;  // 오류


    printf("\n변경 후\n");
    printf("a = %d\n", a);

    return 0;
}

 

즉 , 

const int *p -> 값 보호

int *const p -> 포인터보호

const int *const p -> 둘 다 보호