상수포인터, 포인터상수, const

상수포인터와 포인터상수의 차이

포인터와 배열을 배우다 보면 상수포인터와 포인터상수라는 용어를 많이 듣게 됩니다.

단어만 생각하면 순서만 바뀐 용어인데 뜻은 어떤지 알아볼까합니다.


/* 

2014 9/19 추가부분

영어로 관련표현은

constant pointer - 포인터의 값이 상수인 포인터

pointer to constant - 상수를 가리키는 포인터

constant pointer to constant -상수를 가리키는 constant pointer

3가지입니다.

제가 여러책을 본 결과 한국어 번역으로 ,포인터상수와, 상수포인터는 번역상의 차이지 결국은 같은 의미로 혼용되고 있다고 생각이듭니다.어떤 책에서는 배열변수명이 포인터 상수라고하고 어떤 책에서는 상수포인터라고합니다. 어떤 책에서는 이에 대한 언급조차 되지 않고 있습니다.

/*



일반적으로 배열명을 포인터 상수라고 합니다. 이 설명은 포인터 변수(일반적인 포인터)와 대조해서 설명하기 위한 용어입니다.

이는 포인터 변수와 비슷하지만 상수적 특성을 나타낸다는 의미입니다.

다음을 살펴보겠습니다.

포인터상수ar은 포인터상수이다.

위 배열의 선언에서 ar은 배열명입니다. 배열명은 배열 전체를 의미하기도 하지만 배열의 시작주소값을 나타내기도 합니다.

배열의 시작번지는 ar[0]의 주소값 &ar[0]입니다.

ar배열은 시작번지로부터 차례로 문자열의 요소를 하나씩 나타내는데 메모리상에서 각 요소들이 연속적으로 붙어있습니다.

메모리상에 연속적으로 붙어있기 때문에 ar이 가리키는 주소가 변하게 되면 배열정보가 엉망이 됩니다.

그래서 ar이 가리키는 주소를 못 바꾸게 하기 위해 배열생성부터 상수값으로 고정되어 있습니다. 

그래서 배열명을 포인터 상수라고 합니다.

단 포인터 상수는 가리키는 주소값은 고정이지만 주소값이 가리키는 대상체는 얼마든지 바꿀 수 있습니다.

 

 

 

 

그럼 상수포인터를 알아봐야 하겠는데요, const에 대해 잠시 설명할까 합니다.

const는 변수를 상수화 시켜주는 키워드입니다.

#define도 특정 문자열을 상수화 시키지만 const와 다르게 전처리기에 의한 치환에의해 코드에 삽입된다는 것이 다릅니다.

const는 컴파일 상에서 지원해 주는데요. 일종의 추가되는 타입선언이라고 생각해도 무방합니다.

특징은 변수를 상수화 시키는 용도로 사용합니다.

사실 const는 컴파일러상에서 제공하는 안전장치로서, 컴파일러가 프로그래머가 실수하지않도록 도와주는 역할을 합니다.

코딩만 완벽하다면 없어도 된다는 이야기죠.

 

여기서 a는 상수지시포인터(pointer to constant)라고 합니다.

상수지시포인터는 상수를 가리키는 포인터라는 뜻으로 포인터 자체는 상수가 아닙니다.


 

 

 

그런데 이 const는 *를 기준으로 왼쪽 또는 오른쪽에 붙을때 마다 그 의미가 달라집니다.

 

위에 a는 상수지시포인터(pointer to constant),

아래 b는 상수포인터(constant pointer)라고 합니다. 상수 포인터는 포인터가 상수라는 의미입니다.(포인터가 가리키는 주소값을 바꿀 수 없음)


const의 위치에 따라서 의미하는 바가 다릅니다. 그리고 const키워드가 *좌우로 전부 붙는 경우는 상수지시상수포인터인데요, 이경우는 값도 주소값도 바꿀 수가 없습니다. 한마디로 얼음시켜 놓은거죠.

그리고 최신 컴파일러에선

 

이런 선언에 경고가 뜰 수가 있습니다.

그럴땐 선언에 const를 붙여주면 됩니다.

2014/01/10 - [프로그래밍/error] - deprecated conversion from string constant to 'char*'

 

물론 이렇게 값을 바꿀수 있습니다.


///

2014/ 9/19 추가

결론 내리자면 이 두 용어는 사용은 여러 논란이 있습니다. 포인터상수냐, 상수포인터냐의 문제는 논란이 있고 번역서 상에는 미묘한 차이가 있습니다. 어떤 번역서에서는 두 가지를 언급하지 않기도 합니다. 포인터 상수를 상수 포인터와 같은 의미로 사용하기도 합니다. 중요한 것은 이 개념에 대한 문법적인 이해라고 생각합니다. 

반응형
이 댓글을 비밀 댓글로
  1. 작성자님, 배열의 이름은 '상수 포인터'이지, '포인터 상수'가 아닙니다.
    포인터가 주소를 담을 수 있는 변수이고, 배열 이름은 주소를 담은 상수입니다.
    그래서 '상수 포인터'란 용어가 생긴겁니다. 애초에 포인터(변수)가 아니었기에, 상수화 과정이 필요없습니다.
    '포인터가 가리키는 변수의 상수화'와 '상수 포인터'간의 혼동이 있으신것 같습니다.

    증거가 필요하시다면, A book on C, p245 3째 줄 An array name by itself is treated as a constant pointer 라고 되어있습니다. 영어는 번역이 반대이니 '포인터 상수'라고 읽어야 하지 않냐고 하신다면 곤란합니다.
    또 다른 도서인 열혈강의 C프로그래밍, p307에도 명시 되어있구요.

    학생들이 과제 제출을 했는데, '포인터 상수'의 개념을 이상하게 쓴 학생들이 많아서 알아봤더니, 인터넷에 그렇게 나와 있었다고 하더군요. 다음에는 좀 더 신중히 게재 해주시면 좋겠습니다.
    • PSJ_Official님 댓글 감사합니다. 관련 오류는 수정을 했습니다. 하지만 포인터상수냐, 포인터 변수냐하는 문제는 의미가 없다고 생각합니다. 그리고 An array name by itself is treated as a constant pointer 의 뜻을 생각해보자면 배열명이 constant pointer라는 뜻이 아님을 알 수 있습니다. 배열명이 constant pointer의 기능을 한다는 의미를 강조하기위해 by itself is treated as 로 설명한 듯 보입니다. 이 부분은 PSJ_Official님께서 말하신대로 배열명과 포인터는 관련이 없고 기능적 유사성이 있기 때문이라 생각듭니다. 하지만 상수포인터의 용어가 배열명을 의미하기위해 생긴 것이란 것에대해서는 동의할 수 없습니다. 왜냐면 상수포인터(constant pointer)는 원서든 번역서든 명확한 설명이 있기 때문입니다.

      논란의 핵심은 배열명이 상수포인터냐는 것입니다. 결론은 X이고, 상수포인터와 기능적으로 유사하고 입문자 입장에선 이해하기 쉽기 때문에 번역서에서는 관용적으로 사용되왔지만,, 배열명이 상수포인터라는 등식은 번역상의 오류라고 생각됩니다.

      저도 이부분에대해서 더 알아봤지만, 포인터상수라는 말 자체가 원서내부에서 어떻게 정의되어있는지 찾지 못했습니다. 제가 이해하는 바로는 포인터상수는 번역시 포인터변수와 대조하여 설명하기 위해 생겨난 용어 같습니다.
      원서에서는 세가지만 설명합니다.
      constant pointer
      pointer to constant
      constant pointer to constant
      혹자는 포인터상수를 문자열상수, 배열명, 함수명 이라고 합니다.
      어쨋든 이는 상수포인터의 기능을 합니다. 이런이유로 혼용 사용되어 혼동이 되는 것으로 생각됩니다..
      앞으로 좀더 신중하게 글을 쓰도록 하겠습니다.
    • Favicon of https://goduck2.tistory.com 오리뎅이
    • 2016.12.28 19:59
    관리자의 승인을 기다리고 있는 댓글입니다