C/C++ 포인터에 대한 몇가지 다른 설명

C/C++ 2006. 12. 12. 01:06
C/C++을 공부하는 입장에서 포인터는 정말이지 난해하기 짝이없는 개념이다.
하지만 모두가 입을 모아 포인터는 꼭 이해하고 능숙하게 다룰수 있어야 한다고 말하니 더욱 난처하다.

내 경우에는 C를 고등학교때(중학교때였나?ㅡㅡㅋ) 처음 공부를 시작했는데 번번히 포인터 개념을 잡지못해서 좌절하고 책을 덮어버렸던 기억이 난다. 그러다가 대학 1학년때 차 모 교수님께서 '컴퓨터의 기초'과목 수업중에 흘리듯이 하신 얘기가 귀에 꽂혀버려서 그 이후로 지금까지 큰 어려움 없이 프로그래머의 길을 걷고 있다.

정확히 교수님이 말씀하셨던 표현 하나하나는 기억나지 않지만.. 대충 이런거였다.

[CODE type=C]int A = 10;
int *pA = &A;
[/HTML][/CODE]
이 코드에서 보면 "int형 변수 A가 선언되고 10으로 정의되었다. int형 포인터변수 pA가 역시 선언되고 A를 참조한다."고 모든 책에서 설명한다. 이걸 말을 좀 다르게해서 학생들이 이해할때까지 말씀해주셨는데..

A는 어떤 값을 가지는 메모리 공간의 이름이다. 실제 컴퓨터는 'A'라는 이름은 모른다. 하지만 소스 코드 상에서는 10이란 값을 쓰고 싶을때는 A를 쓰면 된다. 물론 A에 딴 값을 저장하기 전에 말이지.. 그렇다면 A가 어딨는지는 안궁금한가? A가 있는 위치가 pA에 적혀있다. 'pA'역시 그냥 이름이다 컴퓨터는 'pA'를 이해하지 못한다. (사람은 이해하는데 컴퓨터는 이해하지 못하는걸 컴퓨터가 이해하도록 연결지워주는게 컴파일러의 역할이다)

이말이 어렵나? 그럼 이렇게 생각해보자..
딱맞는 개념은 아니지만 처음엔 이렇게 알아도 무방할 정도로 잘 들어맞는다.

A는 int형 변수다. *pA도 int형 변수다. 특이하게도 변수이름 첫글자를 *을쓰면 *을 뗀 변수명도 사용 가능해지는데, *을 떼면 주소를 알수 있다. 주소를 알고 싶은데 *을 안붙이고 선언했다면 &A라는 변수를 쓰면 된다. 위 코드에서 &A는 pA와 같은 값(10이 저장된 메모리주소)가 들어있다.
기억하자. A를 선언하면 &A도 같이 선언되는거고, *pA를 선언하면 pA도 같이 선언되는거다 라고..
개념이 잡히면 이 말의 어디가 틀린지 자연히 알게 될꺼다. 개념이 안잡히면 졸업할때까지 이렇게 알고 있어도 프로그래밍 숙제는 짤수 있다. 그래도 어디가 틀린지 모르면 졸업 안시켜준다.

대충 이렇게 개념을 설명해 주셨었드랬다.
포인터를 잘 알고(적어도 난 그렇게 생각한다;;) 수도없이 포인터를 다루면서도 개념잡힐때까지 이렇게 알고 지내라라는 저 설명은 아직도 머릿속에 남는다. 포인터때문에 머리가 아파올때에는 저렇게 생각하면 의외로 간단히 풀린다. ㅡㅡㅋ

저 개념설명에서 틀린 부분은 *pA는 변수가 아니다..ㅡㅡㅋ 식(statement)이다. &A도 식이다. 하지만 이 (빌어먹을 아직까지 가장 훌륭한) 언어를 개발한 사람조차 저걸 식이라고 우기지는 않는다;;;
어찌됐건 *과 &는 연산자(operator)이고 pA와 A는 피연산자(operand)이다. [CODE type=C]int *pA;[/HTML][/CODE] 는 사실 개념적으로 보면 [CODE type=C]int* pA;[/HTML][/CODE]가 더 정확한 표현이지만 관용구처럼 [CODE type=C]int *pA;[/HTML][/CODE] 가 쓰인다.

근데 **포인터는 어떻게 생각해도 머리에 쥐난다. 습관 들때까지 그냥 쓰는거다;;;
어쩌면 내가 머리가 아주 나쁜걸지도;;;
: