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 포인터에 대하여 알아보도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다~
'c언어' 카테고리의 다른 글
c언어 main 함수의 인수에 대하여 알아보기 (0) | 2023.02.10 |
---|---|
c언어 void 포인터에 대하여 알아보기 (0) | 2023.02.10 |
c언어 다차원 배열과 포인터에 대하여 알아보기 (0) | 2023.02.08 |
c언어 함수 포인터에 대하여 알아보기 (0) | 2023.02.08 |
c언어 배열 포인터에 대하여 알아보기 (0) | 2023.02.08 |
댓글