IT 취미생활.  
Front Page
Tag | Location | Media | Guestbook | Admin   
 
복잡한 포인터(Pointer) 읽기
제가 종종 들리는 신영진님의 "지니야 넷"에서 훔쳐 온 글입니다.
원문 그대로 옮겼습니다. 트랙백을 통해서 글을 연결하고 싶지만,,,,,;;,,,,

원문이 없어지는(?) 일이 종종 있어서 아쉬운 마음에 담아왔습니다.
널은 아량으로 용서를 빕니다. ~

복잡한 포인터를 읽는 법에 대해서 잘 설명을 해주셨습니다.
좌에서 우로~ 3가지의 표현을 영어로 해석하게 되면
아무리 복잡한 포인터라도 의미를 쉽게 알 수 있습니다.

팀내 친한 선배님(이의진 책임님)은 안에서 "원을 그리며 읽어라"라고 하셨습니다.
거의 일맥 상통한다 볼 수 있습니다.

저도 또한 포인터를 많이  사용합니다.
Callback Function을 주로 사용하거나, Struct에 Fucntion Pointer member를 이용하여
구조체 자체를 넘기기도 하고, 2차 배열 동적할당을 위해서 사용하기도 합니다.

포인터는 어려운 것이 아닙니다. 다만 프로그래밍을 싫어하는(?) 선배들에 의해서
포인터가 어렵데 어렵데라는 말에 벌써 벌벌 떨진 않았나 돌아 봅니다.

포인트를 이해 하기위해서는 약간의 자기만의 이해 방법이 있어야 하고 ~
도서관에서 얇은 책을 보고도 포인터를 알 수도 있습니다.
알려고 노력 했을 경우 입니다. ^^

혹시 포인터 말고도 더 많은 지식을 얻고자 한다면 아래 신영진 님의 싸이트를
방문 해보시면 ..^^ 살이 되고 피가 되는 좋은 내용들을 얻을 수 있을 것입니다.

그럼 고운하루 되세요~!



신입 개발자를 위한
복잡한 포인터 선언을 해석하는 방법
신영진 pop@jiniya.net http://www.jiniya.net

C언어 게시판에 자주 올라오는 질문 중에 하나가 복잡한 포인터 선언문을 해석하는 것들이다. 대부분의 학생들은 이것을 막연히 외우려고 한다. int *a[3]은 int 포인터를 저장하는 배열이고, int (*a)[3]은 int 배열에 대한 포인터라고 외우는 것이다. 하지만 이렇게 외운 지식은 그 형태가 조금만 달라져도 무용지물이 된다. 그렇다면 어떻게 해야 이러한 선언문을 손쉽게 해석할 수 있을까? 간단한 규칙만 이해하면 된다.

복잡한 선언을 정확하게 이해하기 위한 첫 단계는 선언문 내부에 나타나는 각 요소의 정확한 의미를 이해하는 것이다. <표 1>에는 선언문 내부에 나타나는 각 구성요소의 의미와 사용 예가 나와있다. 선언문을 해석할 때 영어를 이용하면 굉장히 편리하게 해석할 수 있다. 따라서 각 기호에 맞는 영어 표현도 같이 알아두는 것이 좋다.

표 1 표현식에 나타나는 기호들의 의미

기호

표현

의미

*

pointer to

특정 대상체를 가리키는 포인터

int *a;

a int 형을 가리키는 포인터다.

[]

array of

특정 대상체를 저장하는 배열

int a[3];

a int 3개 저장할 수 있는 배열이다.

()

function

인자를 받고 값을 리턴하는 함수

int a();

a는 인자가 없고 int를 반환하는 함수다.


다음으로 이해해야 하는 것은 선언문을 해석하는 순서다. 선언문은 선언 대상이 되는 변수 명에서 시작해서 오른쪽으로 가면서 해석한다. 선언문의 끝이나 오른쪽 괄호를 만나면 방향을 바꾸어 왼쪽으로 가면서 해석한다. 왼쪽으로 가면서 해석을 하다 왼쪽 괄호를 만나면 다시 오른쪽으로 가면서 해석한다. 이렇게 해서 선언문의 가장 왼쪽 끝에 도달하면 해석이 마무리 된다.

표 2 복잡한 표현식들의 해석 순서와 해석 결과

표현식

해석 순서

해석 결과

int **a;

 

a => a; => *a; => **a; => int **a;

a is a pointer to pointer to int

a int를 가리키는 포인터의 포인터다.

int *a[3];

 

a => a[3] => a[3]; => *a[3]; => int *a[3];

a is an array of 3 pointer to int

a int를 가리키는 포인터를 세 개 저장하는 배열이다.

int (*a)[3];

 

a => a) => (*a) => (*a)[3] => int (*a)[3]

a is a pointer to array of 3 int

a int 세 개를 저장하고 있는 배열을 가리키는 포인터다.

int *(*(*fp1)(int))[10];

fp1 => fp1) => (*fp1) => (*fp1)(int) => (*fp1)(int)) => (*(*fp1)(int)) => (*(*fp1)(int))[10] => *(*(*fp1)(int))[10]; = > int *(*(*fp1)(int))[10];

fp1 is a pointer to function that takes an int as an argument and returns a pointer to an array of 10 pointers to ints.

fp1 int를 인자로 받고 int에 대한 포인터를 열 개 저장하는 배열을 가리키는 포인터를 리턴하는 함수에 대한 포인터다.

char *(*(**foo[][8])())[];

foo[] => foo[][8] => *foo[][8] => (**foo[][8]) => (**foo[][8])() => *(**foo[][8])() => (*(**foo[][8])())[] => char *(*(**foo[][8])())[]

foo is an array of array of 8 pointers to pointer to function that returns a pointer to array of pointer to char.

foo char를 가리키는 포인터를 저장하는 배열을 가리키는 포인터를 리턴하는 함수에 대한 포인터를 가리키는 포인터를 8개 저장할 수 있는 배열에 대한 배열이다.




BLOG main image
취미생활
 Notice
 Category
분류 전체보기 (191)
매일매일갱생 (83)
서버개발 (1)
임베디드개발 (12)
Programming (80)
Personal Projects (6)
유용한 프로그램 (0)
 TAGS
debugging 영어 이메일 Debug DVB-T 벨소리 변경 1seg isdbt Error Case DirectShow Algorithm It ISDB-T warning M480 spam mail 알고리즘 English 군대 Wince5.0 MP3 english email C++ 미라지폰 서태지 티스토리초대 Windows Mobile6.0 음식 C 출장 티스토리 초대장 DVB 퇴사 Java Brazil Dshow project VC++ 개발자 Linux
 Calendar
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
 Recent Entries
 Recent Comments
 Recent Trackbacks
 Archive
 Link Site
zextor
괴짜 프로그래머의 일상사~@@
Gag & Peace, and more..
Kazakhstan Almaty.......
Min-A
Sadgarret
Steve Yoon's log
가슴 뛰는 삶을 살아라
오스틴 파워
GUI sin
melanie parker_Lady
제레미의 TV 2.0 이야기..
 Visitor Statistics
Total :
Today :
Yesterday :
rss