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

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.

Comments powered by Disqus.

배열 포인터(array pointer)와 포인터 배열(pointer array) 차이 정리

C언어로 스택 stack 자료구조 만들기