프로그래밍/C언어

c언어 포인터 읽는 방법만 알아도 반은 안다.

콘파냐 2017. 4. 12. 17:15
반응형

요즈음 책들은 양도 질도 많이 높아졌다고 생각합니다. 그래서 C언어를 공부하시는 많은 분들은 이 내용을 잘 아시리라 생각듭니다. 제가 요즈음 나온 기본 문법서는 제대로 본적이 없지만 잘은 모르겠네요. 아무튼 아직까지 책에서 제대로 이 부분을 짚어놓은 책을 본 적이 없어서 포인터의 읽는 법에 대해서 몇가지 주저리 써보겠습니다. 몇몇 분들께는 조금이나마 도움이 되었으면 하는 바램으로 글을 써나가겠습니다.


사실 포인터에 대한 개념을 제대로 이해하기 위해서는 읽는 법이 매우 중요합니다. 왜냐면 어찌되었건 우리는 코드를 통해서 생각을 하기 때문에 코드가 자연스럽게 읽혀져야 포인터가 어떻게 동작하는지에 대해서 지속적이고 올바른 방향으로 생각해 나갈 수 있기 때문이다. 좀 추상적으로 말한 듯 한데 결론은 제대로 읽어야 제대로 이해할 수 있다는 것입니다. 


가장 중요한 포인트는 우선 포인터를 읽을 때는 영어로 생각하셔야 한다는 것입니다. 예를들어 상수포인터 또는 상수지시 포인터라고 외워도 사실 이 두 가지를 구분하는 방법은 결국 영어입니다. 한글로 놓고 이것은 이렇고, 저것은 저렇고 따져봐야 애초에 포인터 문법도 한글이 아닌 영문법을 기초로 표시한 것이므로 한글로 해석해 놓아도 계속 헷갈릴 수 밖에 없습니다. IT용어에서 한글화가 무의미한 경우가 많아요. 억지로 하면 피곤합니다.


pointer to const int , const point to int


아무리 제대로 설명을 하더라도 머리 속에서 이해하는데 논리가 깊어지면 부하가 걸릴 수 밖에 없습니다. 모든 것은 단순화 해야합니다. 우선 이 두가지를 코드로 나타내면 다음과 같습니다. 


위 코드가 핵심입니다. 사실 센스있는 분들에게는 더 이상 설명 안드려도 됩니다. 우리가 포인터가 선언된 선언문을 해석할 때 해석방향을 → (왼쪽에서 오른쪽) 해왔다면 앞으로는 ←(오른쪽에서 왼쪽)으로 하시길 바랍니다.  이것이 핵심이고 위에 주석으로 달아 놓은 것은 ←이 방향으로 단순히 해석한 것 뿐입니다. 하나씩 살펴보겠습니다.


const int *

pointer to는 *, const int는 타입입니다. 즉 한글로 상수타입를 가리키는 포인터라는 의미입니다.


두번째 볼까요? 

int * const

const pointer to는 * const, int는 타입입니다. 즉 int타입을 가리키는 상수 포인터라는 뜻입니다. 포인터가 가리키는 대상이 상수가 아니고 포인터가 상수겠죠?


이 둘을 어떤 분들은 상수포인터 또는 상수지시 포인터라고 구분해서 알고 계시죠? 사실 저도 예전에는 이렇게 배우고 그랬지만 이런 한글화는 의미없다는 것이 지금까지 포인터를 사용하면서 느낀 결론입니다. 영어로 이해하면 제대로 읽혀지고 또한 변수의 성질을 정확하게 파악할 수 있습니다. 물론 기본적인 포인터에 대한 이해가 전제되야겠죠.



몇가지 더 해보도록 하겠습니다.

cont int **

이중 포인터가 나왔습니다. 영어로 이렇게 읽습니다. 

pointer to pointer to const int

한글 이해하는 것 보다 포인터의 구조가 더 확실히 들어옵니다.


다음은 어떨까요?

int ** const **

pointer to pointer to const pointer to pointer to int

한번 한글로 해석해 볼까요? 너무 복잡합니다. 상수지시 포인터와 같은 말이 왜 의미없는지 아시겠죠?


한가지 더 해보죠

int const * const * const *

pointer to const pointer to const pointer to const int


const int와 int const는 같은 의미입니다. 보통 const int라고 많이 쓰이죠.


이 정도 이해하신다면 읽는 방법을 잊어버리지 않으실 겁니다. 또한 포인터에 대한 기본 사항을 익히셨다면 구조가 눈에 확연히 보일 겁니다. 사실 포인터는 어렵지 않습니다. 복잡해 보일 뿐입니다. 개발을 하거나 공부를 해가는데 조금이라도 도움이 되었으면 합니다.

글을 퍼가실 때는 출처를 반드시 남겨주세요.

반응형