본문 바로가기
c언어

c언어 const 포인터와 volatile 포인터에 대하여 알아보기

by 개발자 L 2023. 2. 9.
반응형

c언어 const 포인터와 volatile 포인터에 대하여 알아보기

네 안녕하세요, 이번 포스팅에서는 const 포인터와 volatile 포인터에 대하여 알아보도록 하겠습니다.

이 둘은 특정한 상황에서 쓰이는 한정적 포인터들입니다.

그럼 이들을 어떻게 어떤 식으로 쓰는가 한 번 알아보도록 하겠습니다.

 

1 const 키워드

const는 다들 아시다시피 변수를 상수화 시킬 때 쓰는 키워드입니다.

그래서 우리가 변수를 상수화를 시키듯이,

값을 변경하지 않고 고정을 시켜야만 할 때 사용합니다.

사용 방법은 이렇습니다.

const char *p; // 포인터 p가 가리키는 내용이 변하지 않음.
char *const p; // 포인터 p가 변하지 않음.

const 키워드를 포인터에 쓰는 방법이 크게 이렇게 두 가지입니다.

첫 번째 경우는 포인터 p가 가리키는 내용이 변하지 않는다는 뜻이고,

두 번째 경우는 포인터 p 자체가 변하지 않는다는 뜻입니다.

이게 어떻게 다른 지 코드를 써서 보여드리도록 하겠습니다.

#include <stdio.h>

int main()
{
    char s[] = "Barking dogs seldom bite";
    char t[] = "A bad workman blame his tools";
    const char *p = s;
    char *const q = s;
    
    p = t; // p의 값은 변경이 가능하다.
    //p[3] = 'a'; // p가 가리키는 곳의 내용은 변경이 불가하다.



    q[3] = 'a'; // q가 가리키는 곳의 내용을 변경할 수 있다.
    //q = t; // q는 변경이 불가하다.
    
    printf("%s\n", p); // p를 출력하기 위한 코드
    //printf("%s\n", q); // q를 줄력하기 위한 코드

    return 0;
}

이렇게 작성을 해봤고,

각각의 경우에 어떤 식으로 나오는지 보도록 하겠습니다.

반응형

 

// p = t;
A bad workman blame his tools

// p[3] = 'a';
C:\c, c++ folder>cd "c:\c, c++ folder\" && gcc tempCodeRunnerFile.c -o tempCodeRunnerFile && "c:\c, c++ folder\"tempCodeRunnerFile
tempCodeRunnerFile.c: In function 'main':
tempCodeRunnerFile.c:10:10: error: assignment of read-only location '*(p + 3u)'
     p[3] = 'a';
          ^

// q[3] = 'a';
C:\c, c++ folder>cd "c:\c, c++ folder\" && gcc tempCodeRunnerFile.c -o tempCodeRunnerFile && "c:\c, c++ folder\"tempCodeRunnerFile
Baraing dogs seldom bite

// q = t;
C:\c, c++ folder>cd "c:\c, c++ folder\" && gcc tempCodeRunnerFile.c -o tempCodeRunnerFile && "c:\c, c++ folder\"tempCodeRunnerFile
tempCodeRunnerFile.c: In function 'main':
tempCodeRunnerFile.c:15:7: error: assignment of read-only variable 'q'
     q = t;
       ^

각각의 경우를 보면 에러가 나는 게 있고, 그렇지 않은 것이 있을 겁니다.

p의 경우는 p의 값은 변경할 수 있지만, p가 가리키는 값은 변경이 불가했습니다.

그리고 q의 경우는 그와 반대의 경우였지요.

이 차이는 앞서 말했듯이 const 키워드와 에스터리스크의 위치에 따라서 결정이 됩니다.

포인터가 가리키는 값이 변경이 불가한 것이냐,

아니면 포인터 변수 자체의 값을 변경할 수 없는 것이냐 말이죠.

 

2. volatile 키워드

volatile은 직역을 하면 '휘발성이 강한 물질'이라는 뜻입니다.

그렇기 때문에 한 번 저장이 되면 값을 우리가 값을 바꾸기 전까지 바뀌지 않지만,

volatile 변수는 프로세스나 스레드 등이 값을 항상 수시로 바꿀 수 있습니다.

그렇기 때문에 사용을 할 때마다 다시 로드가 되며,

동일한 메모리를 여러 개의 프로세스나 스레드가 이용을 하는 경우에 주로 사용을 하게 됩니다.

그리고 그만큼 불안정한 키워드이기 때문에 volatile이 붙은 변수는 c 컴파일러가 최적화 시에 제외시킵니다.

이 키워드의 사용 방법은 이렇습니다.

volatile char *p;

 

여기까지 const 포인터와 volatile 포인터에 대하여 알아보았습니다.

다음 포스팅에서는 void 포인터에 대하여 알아보도록 하겠습니다.

긴 글 읽어주신 독자분들께 진심으로 감사드립니다~

반응형

댓글