Post

C언어에서 const를 사용하는 이유와 선언의 의미

C언어에서 const를 사용하는 이유와 선언의 의미

C언어를 배우게 되면 const를 사용하는 것을 종종 볼 수 있는데 보통 있던 없던간에 동일하게 작동하는 경우도 있을 것입니다. 하지만 굳이 이런 const를 사용하는 의미가 있겠지요 코딩은 불필요한것을 싫어해서 하는건데 불필요한데 굳이 사용하는 이유가 있을 것입니다.

1
Const를 통한 포인터 변수 선언은, 해당 포인터변수가 가리키는 대상이 변하지 못하게 함을 의미

const int * ptr 형태

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS

int main() {
	int num = 10;
	const int* ptr = &num;
	//ptr이 가르키는 대상은 항상 num으로 고정됨 변경 못함

	*ptr = 20;
	return 0;
}

img1 result

실제로 const를 통해서 선언한 포인터 ptr에다가 num을 간접참조하고 여기에다가 값을 변경할려고하니 비쥬얼 스튜디오 기준 C2166 I-value가 const 개체를 지정합니다 라고 하면서 컴파일이 안됩니다.

다만 ptr이 변경을 못하는 것일뿐 num에다가 const를 지정한 것은 아니기에 num값을 직접 바꾸는 것은 가능합니다.

int * const ptr 형태

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#define MAX_SIZE 10

int main() {
	int num = 10;
	int* const ptr = &num;

	*ptr = 20;

	int num_a = 20;
	ptr = &num_a;
	//ptr은 처음 지정한 num이외에 다른 값을 참조할 수 없음

	return 0;
}

이번에는 int*와 const 위치가 변경되었습니다. 하지만 이전과 다르게 *ptr = 20 값을 변경하는 것에는 에러가 나지 않지만

ptr이 다른 값을 새로 참조하는 것은 에러가 났습니다.

이 둘을 모두 사용하는 것도 가능합니다.

const int * const ptr 형태

이렇게 되면 ptr은 num값만 참조하고, num값의 변경도 불가능합니다.

This post is licensed under CC BY 4.0 by the author.