오늘은 포인터 두번째 날 입니다. 처음 오신 분들은 이전 포스팅을 통해 포인터의 기초를 먼저 보고 오시는 것을 추천드립니다. 오늘은 기초에서 한발자국 더 나아가 포인터의 심화과정을 이야기 해 보려고 합니다.
상수 포인터
우리가 이전에 상수에 대해서 알아보았던 적이 있습니다. 상수는 변수와는 달리 초기에 설정하고 나면 절대 바꿀 수 없는 값이었죠. 어떤 정수를 상수로 선언을 하고자 한다면 아래와 같은 형태를 가졌었습니다.
이렇게 선언하면 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은 되는게… 오늘은 이렇게 상수 포인터에 대해서 알아보았습니다. ^^
제 블로그를 방문해 주셔서 감사합니다.
도움이 되셨다면 공감(좋아요) 부탁드리고,
댓글은 다른분들께도 좋은 정보일 수 있으니
공개로 부탁드립니다.
여러분의 작은 정성이 좋은 포스팅을 생산하는
힘이 된답니다. :)
감사합니다.
'PROGRAMMING > C' 카테고리의 다른 글
C언어 포인터 심화과정 (배열과 포인터, 포인터의 포인터) (0) | 2022.11.02 |
---|---|
C언어 포인터 심화과정 (포인터 연산) (3) | 2022.11.01 |
C언어 포인터 기초 (0) | 2022.10.26 |
C언어 배열 응용 (0) | 2022.10.25 |
C언어 배열 기초 (0) | 2022.10.24 |
댓글