14 쉽게보는 C언어 포인터(Pointer)
쉽게보는 C언어 포인터(Pointer)
원문 : http://kkamagui.springnote.com/pages/1111588
0.시작하면서...
C언에서 가장 핵심적인 부분을 들라면 배열(Array)와 포인터(Pointer)라고 할 수 있다. 배열과 포인터는 비슷한 성격을 가지면서도 다르며, 서로 변환 가능한 특징을 가지고 있다. C언어의 기초를 마스터했다면 1차원 배열과 포인터를 사용하는데 별 문제가 없을 것이다. 하지만 다차원 배열과 그에 대응하는 포인터, 그리고 함수 포인터에 대한 내용은 조금 생소할 수 있다.
이론상 포인터와 배열은 변수 명(Identifier) 앞 뒤에서 계속해서 확장해 나갈 수 있다. 즉 **( *( *d[ 20 ] ) )[ 5 ][ 4 ] 와 같이 확장해 나갈 수 있는 것이다. 포인터와 배열에 익숙하지 않은 개발자라면 위의 문장을 보고 고개를 갸웃할 것이다. 혹자는 컴파일 에러가 발생하는 것이 아닌가 의심할수도 있다. 하지만 불행하게도 이는 문법에 아주 잘 맞는 문장이며, 운이 나쁘면 여러분이 앞으로 볼 코드가 될수도 있다. 하지만 이런 복잡한 포인터와 배열도 원리만 알면 간단히 해결할수있다.
그럼 다차원 배열에 대응하는 포인터를 기술하고, 함수 포인터의 원리를 알아보자.
1.배열과 포인터의 해석법
"*" 연산자는 배열이름(Identifier)의 앞에 위치하고 "[]" 연산자는 배열의 뒤에 위치하며 계속해서 확장가능하다. 그렇다면 두 연산자의 우선순위는 어떻게 될까? 그에 따라서 int* a[ 10 ]의 해석이 배열의 포인터도 될 수 있고 포인터의 배열이 될수도 있다.
연산자의 우선순위니 좌에서 우의 법칙이니 하는 딱딱한 이야기는 접어두고, 간단하게 한가지만 알면 된다.
즉 int* a[ 10 ]은 [ 10 ]이 먼저 해석되어 a의 타입은 배열이되며, int *를 가지는 10개짜리의 배열이 된다. 그렇다면 배열의 포인터를 기술하려면 어떻게 해야 할까? 그렇다. () 기호를 사용해주면 먼저 해석하게 되므로 Int ( * a )[ 10 ]으로 쓰면 int [ 10 ]의 포인터가 된다.
그럼 좀 더 깊이 들어가보자. int ( **d[ 20 ] )[ 5 ]에서 d는 어떻게 해석해야할까? 아래와 같은 순서로 해석하면 된다.
다시 읽어보면 약간 헷갈릴 수 있는데, 이것을 뒤에서부터 읽으면 더 명확해 진다.
복잡한 우선순위를 따져서 해석하는 것 보다는 훨씬 쉽지 않는가?
1.다차원 배열에 대응하는 포인터
일단 복잡한 설명을 하기 전에 간단히 생각을 해보자. int a[ 10 ]에 대응하는 포인터는 어떻게 나타낼 수 있는가? int *p로 나타낼 수 있다. 그렇다면 int b[ 10 ][ 10 ]에 대응하는 포인터는 뭘까? int (* b)[ 10 ]으로 나타낼 수 있다. 그렇다면 int c[ 20 ][ 30 ][ 40 ]에 대응하는 포인터는? int (* p )[ 30 ][ 40 ] 이 된다.
그렇다면 **( *( *d[ 20 ] ) )[ 5 ][ 4 ]에 대응하는 포인터는 뭘까? 글쎄.... 저런게 가능할지 의문이 드는 사람도 있을 것이다. 결론부터 이야기 하자면 **( *( **p ) )[ 5 ][ 4 ] 가 된다.
History
Last edited on 04/24/2008 20:21 by kkamagui
Comments (0)