easy software

C언어 포인터와 const(상수) 본문

C언어/포인터와 배열

C언어 포인터와 const(상수)

JAVA 웹개발자 2015. 1. 19. 22:05

안녕하세요. 이번 시간에는 포인터와 const 키워드에 대해 알아보고자 합니다.

 

앞서 공부한 내용보다는 무척 쉬운 것이지만 상당히 중요한 프로그래밍 습관을

 

길들일 수 있는 것이니, 주의깊게 살펴보시기 바랍니다.

 

 

 

const란 무엇일까요?

 

const키워드는 변수를 상수화 시켜주는 것을 의미합니다.

 

즉, 값을 변경하지 못하도록 막는역할을 하는 것이죠.

 

3,14라는 파이값은 불변의 수죠?

 

이런 파이값을 코드로 작성할 때 const키워드를 사용하는 것입니다.

 

만약, 프로그래머가 파이값을 상수로 정의하지 않고 코드를 작성하다가

 

실수로 중간에 파이값을 바꾸는 코드를 작성해버리면 어떻게 될까요?

 

컴파일할때는 전혀 문제가 되지 않았지만, 출력물은 엉망이 되어있을 수 있습니다.

 

짧은 코드를 가진 프로그램이면 그나마 괜찮은데, 5천라인의 코드를 작성하다가

 

저런 문제가 발생하면? 생각만해도 끔찍합니다.

 

그렇기 때문에 값을 변경하지 않을 것이라면, 반드시 const를 사용하는 습관을 길러두시기 바랍니다.

 

그럼 이제 포인터와 const키워드의 관계를 알아봅시다.

 

 

 

1. 포인터가 가리키는 변수의 상수화

 

1:     int a = 10;

2:     const int* p = &a;

3:     *p = 30; //에러

4:     a = 30;

 

3번째 라인에서 에러가 발생했습니다.

 

const의 위치를 보시면 int* 앞에 선언되어 있습니다.

 

const가 가장 앞에 선언되어 있을 경우

 

포인터를 통해서 변수의 값을 변경하는 것을 막겠다는 뜻입니다.

 

그러므로 p를 통해 a의 값을 변경하는 것은 불가능하지만

 

변수a자체는 상수가 아니기 때문에, 포인터를 사용하지 않고 변경할 때는 전혀 문제가 되지 않습니다.

 

 

 

2. 포인터 상수화

 

1:     int a = 10;

2:     int b = 20;

3:     int* const p = &a;

4:     p = &b; //에러

5:     *p = 30;

 

이번의 const위치를 보시면 p의 바로 앞입니다.

 

이 위치에 const를 작성할 경우에는

 

p가 지니는 주소 값을 변경할 수 없다는 뜻이 됩니다.

 

그러므로 4번 라인에서 p에 다른 주소값을 대입하려 할 경우에 에러가 발생하는 것입니다.

 

하지만, 포인터가 가리키는 값은 상수화 되지 않았으므로 5번 라인처럼 언제든지 변경이 가능합니다.

 

 

 

3. 포인터와 포인터가 가리키는 값을 상수화 하려면?

 

1:     int a = 10;

2:     int b = 20;

3:     const int* const p = &a;

4:     p = &b; //에러

5:     *p = 30; //에러

 

const키워드를 3번 라인처럼 작성해주면 됩니다.

 

3번 라인에서 포인터, 포인터가 가리키는 값 모두 상수화했기 때문에

 

4, 5번 라인에 모두 에러가 발생합니다.

Comments