히히...
먼저 한가지 말씀드릴것은, 씨에 관계된 것은 아래 비주얼씨/터보씨에
올리셨으면 더 좋을뻔 했군요... (표현이 이상한가...?)
전 이 포럼의 운영진과는 정말 아무! 관계도 없지만, 그래두 각 메뉴에
원래의 목적을 살리시는게 좋지 않을까 생각하는데...
하긴 씨빌더도 씨로 코딩하니 영 엉뚱하게 한 건 아니지만... 히히.
질문하신 내용은, 아직 포인터의 본질을 제대로 이해하시지 못한데서
온것으로 보입니다.
예를 들어 int *A_Pointer; 이렇게 선언한후,
int A_Int = 20; 이렇게 변수를 만들고,
A_Pointer = &A
&A_Int; 이렇게 했을때,
잘 생각해 보면 기본적으로 포인터변수라는 것이 이중적인 역할을 한다는걸
알수 있을겁니다.
무슨 말인가 하면, A_Pointer라는 포인터 변수는, 그 자체가 어떤 int형
값의 주소를 갖는 변수로의 의미가 있구요, 또 한편으로는 *A_Pointer라고
할때처럼 가리키는 주소의 값의 의미로도 쓰일수 있습니다.
포인터가 일반 다른 변수보다 좀 어렵다고 하는데는 이런 이중적 성질 덕분
도 있겠지요...
다시말해 A_Pointer는 내용값이 주소값이구, *A_Pointer는 정수값이지요...
이런 포인터의 기본 성질을 잘 이해해야 헷갈리지 않겠지요...
질문하신 예의 경우 const를 가지고 이런 성질을 잘 알려주는 예라고 하겠습니다.
const int *p_snack이라고 할 경우, p_snack이라는 포인터를 사용해서
이 포인터가 가리키는 주소의 값을 수정할 수 없게 하는 것입니다.
반대로
int * const p_snack 이라고 선언하면, 이 포인터가 가리키는 주소를 변경할 수
없도록 하는 결과가 됩니다.
이해가 되시겠나요?
여기서 const의 위치가 앞뒤로 왔다리 갔다리 하는게 바로 const로 제한할
내용! 을 적절히 지시하기 위한 것입니다.
그래서 const int *p_snack 이라고 선언했을 경우, p_snack은 가리키는 주소의
내용을 수정못하도록 제한되어 있으니까 *p_snack이라는 표현은 에러를
일으키지요.
반대로 int * const p_snack 이라고 선언한다면, 변경하지 못하도록 지시된것은
가리키는 주소 그자체가 되기때문에 p_snack = &xxx 이런 표현은 에러를
발생시킵니다.
제 머리가 좀 덜떨어진 편이라 제가 써놓고 봐도 좀 장황한데...
아직 잘 이해가 안되신다면 다시한번 질문을 올려주세요. 그럼 더 자세히...
아예 포인터의 뿌리를 통째로 뽑아드리죠... (히히...)
부산에서 무식이 임펠리테리였습니다.
|