본문 바로가기
PROGRAMMING/C

C언어 포인터 심화과정 (상수포인터)

by 쪼렙엔지니어 2022. 10. 31.
반응형

오늘은 포인터 두번째 날 입니다. 처음 오신 분들은 이전 포스팅을 통해 포인터의 기초를 먼저 보고 오시는 것을 추천드립니다. 오늘은 기초에서 한발자국 더 나아가 포인터의 심화과정을 이야기 해 보려고 합니다. 

상수 포인터

우리가 이전에 상수에 대해서 알아보았던 적이 있습니다. 상수는 변수와는 달리 초기에 설정하고 나면 절대 바꿀 수 없는 값이었죠. 어떤 정수를 상수로 선언을 하고자 한다면 아래와 같은 형태를 가졌었습니다.

이렇게 선언하면 a는 100이라는 정수 데이터를 가진 상수로써 프로그램이 끝날때까지 절대 변할 수 없었습니다. 프로그램을 작성할 때 실수로 상수의 값을 바꾸는 코드를 작성해도 오류를 발생시키며 실행되지 않았었죠. 그럼 포인터에도 상수를 적용시킬 수 있는지 알아보겠습니다.

그렇다면 포인터를 상수포인터로 정의하려면 어떻게 해야 할까요? 3가지 타입이 있습니다.

바로 위 3가지 타입 입니다. 그럼 하나씩 각각에 대해서 알아보겠습니다. 먼저 일반적인 포인터사용입니다

포인터를 선언할 때는 위와 같이 선언할 때 가리키는 주소를 동시에 지정하여도 되고, 아래와 같이 포인터p가 가르키는 주소를 따로 지정해도 괜찮습니다.

이런경우 결과는 이렇게 나옵니다.

이제 const를 집어넣어보겠습니다. const int *p 입니다.

위와 같이 작성하면 컴파일중 바로 오류가 납니다. 왜냐하면 *p=3; 때문이죠.

const int *p는 const가 바로 뒤에 따라오는 int를 담당한다고 생각하시면 편합니다. int는 저장되어 있는 자료를 얘기하므로 포인터 p가 지정하는 주소, 즉 예를들어 변수 a에 저장되어 있는 값을 바꿀 수 없습니다. 이해가 되시나요? int를 변수의 타입으로만 생각하지 마시고 변수에 들어있는 데이터 그 자체로 생각하시면 됩니다. 

그럼 *p=3; 이 아니라 a=3;으로 작성해 볼까요?

어라 이렇게는 잘 되네요? 그럼 이렇게 상수 포인터를 사용하는 건 무슨의미가 있는건지….흠......

여튼 그 다음 int* const p입니다. 

이렇게 하니 바로 오류가 나는군요. int* const p의 경우 const가 바로 뒤에 따라오는 p를 담당한다고 생각하시면 됩니다. 그래서 p에 들어있는 주소값을 변경할 수 없는것이죠. 그런데 p = &a를 사용하여 p안에 들어 있는 주소값을 바꾸려 하니까 오류가 발생하는 것입니다. (첨언하자면 위와 같이 프로그램을 작성하면 상수 포인터를 선언할 때 값을 초기화하지 않았기 때문에도 오류가 발생합니다!!!! 포인터도 변수이니 꼭 값을 초기화(값 입력)를 해야 합니다!!!!!)

이렇게 상수포인터를 지정할 때 주소를 같이 지정해주면 잘 됩니다.

몰래 변수 b를 추가하고 b로 바꿔보려고 해도 안되는군요.

바로 오류가 나버립니다.

 

마지막으로 const int* const p 입니다. 이건 아마도 변수의 데이터도, 포인터의 주소값도 변경할 수 없겠죠? const가 두번 들어가서 각각 바로 뒤에 있는 int와 p를 모두 담당하고 있으니 말입니다. 그럼 확인해 볼까요?

역시나 오류가 납니다.

이렇게 중간에 값을 바꾸는 부분을 제거해야 오류가 안납니다. 이해하셨나요? 그런데 참 신기합니다. 첫번째 상수 포인터에서 이야기 했던 *p = 3은 안되는데 a=3은 되는게… 오늘은 이렇게 상수 포인터에 대해서 알아보았습니다. ^^

 

 

제 블로그를 방문해 주셔서 감사합니다.

도움이 되셨다면 공감(좋아요) 부탁드리고,

댓글은 다른분들께도 좋은 정보일 수 있으니

공개로 부탁드립니다.

여러분의 작은 정성이 좋은 포스팅을 생산하는

힘이 된답니다. :)

감사합니다.

반응형

댓글