{{|
CodeProjectì—�서 최근ì—� 아주 í�¥ë¯¸ë¡œìš´ 글ì�„ ì�½ì—ˆìŠµë‹ˆë‹¤. 글ì�˜ ë‚´ìš©ì�´ 별로 길지ë�„ ì•Šê³ ì›Œë‚™ ìœ ìš©í•œ ì •ë³´ë�¼ ìƒ�ê°�ë�˜ì„œ ë‚ ë¦¼ìœ¼ë¡œ 번ì—해봤습니다. ì˜�어와 한글ì�˜ 어순ì�´ 반대ë�¼ì„œ 매ë�„럽지 못한 부분ì�´ ë§Žì�€ë�° ì�´ëŸ° 경우 ì›�문ë�„ ê°™ì�´ ë³¼ 수 있ë�„ë¡� ê°™ì�´ ì˜¬ë ¸ìŠµë‹ˆë‹¤.
CodeProjectì—�서 최근ì—� 아주 í�¥ë¯¸ë¡œìš´ 글ì�„ ì�½ì—ˆìŠµë‹ˆë‹¤. 글ì�˜ ë‚´ìš©ì�´ 별로 길지ë�„ ì•Šê³ ì›Œë‚™ ìœ ìš©í•œ ì •ë³´ë�¼ ìƒ�ê°�ë�˜ì„œ ë‚ ë¦¼ìœ¼ë¡œ 번ì—해봤습니다. ì˜�어와 한글ì�˜ 어순ì�´ 반대ë�¼ì„œ 매ë�„럽지 못한 부분ì�´ ë§Žì�€ë�° ì�´ëŸ° 경우 ì›�문ë�„ ê°™ì�´ ë³¼ 수 있ë�„ë¡� ê°™ì�´ ì˜¬ë ¸ìŠµë‹ˆë‹¤.
�문 : How to interpret complex C/C++ declarations (http://www.codeproject.com/cpp/complex_declarations.asp)
간혹 int * (* (*fp1) (int) ) 10; ê³¼ ê°™ì�€ ì„ ì–¸ë¬¸ì�´ë‚˜ 혹ì�€ ì�´ì™€ ìœ ì‚¬í•˜ê²Œ 난해한 ì„ ì–¸ë¬¸ì�„ ë³¼ 기회가 있습니까? ì�´ 글ì�€ ì�´ëŸ° C/C++
ì„ ì–¸ë¬¸ì�„ ì§�ë©´í–ˆì�„ 때 ì�´ë¥¼ 어떻게 í•´ì„�하는가를 ì•Œë ¤ì£¼ê¸° 위한 글입니다. 매우 기본ì �ì�´ê³ í�‰ë²”한 ì˜ˆì œì—�서 시작해서 복작한 경우까지
ë‹¤ë£¨ê² ìŠµë‹ˆë‹¤. 우리가 매ì�¼ í�”히 ë³¼ 수 있는 ì„ ì–¸ë¬¸ì�„ 비롯해서 간간히 ë¬¸ì œì�˜ 소지를 ì�¼ìœ¼í‚¬ 수 있는 const ìˆ˜ì •ìž�와 typedef ë°� 함수
��터를 다룬 후 마지막으로 "오른쪽�서 왼쪽으로" 규칙� 알아 봅니다.
ì�´ 글ì�€ 단순히 우리가 ì�´ëŸ¬í•œ ì„ ì–¸ë¬¸ì�„ 맞닥뜨리게 ë�˜ì—ˆì�„ 때 어떻게 ì�´ ì„ ì–¸ë¬¸ì�„ ì�´í•´í• 수 있는가 방법ì�„ ì•Œë ¤ì£¼ëŠ” 것입니다. 여기
ì˜ˆì œì—�서 ì œì‹œë�œ 것과 ê°™ì�´ 복잡한 ì„ ì–¸ë¬¸ì�„ 사용하여 ì�´í•´í•˜ê¸° ì–´ë ¤ìš´ 코드를 작성하는것ì�€ ê²°ì½” 좋ì�€ 프로그래ë°� 습관ì�´ ì•„ë‹ˆê² ì£ .
기초
int a;
위ì�˜ 문장ì�€ '변수 n ì�„ int 형으로 ì„ ì–¸í•œë‹¤'ë�¼ê³ í•´ì„�í• ìˆ˜ 있습니다.
í�¬ì�¸í„°ë¡œ 넘어가서 다ì�Œê³¼ ê°™ì�€ ì„ ì–¸ë¬¸ì�„ 보게ë�˜ë©´,
int *p;
'변수 p를 int *형으로 ì„ ì–¸í•œë‹¤' ë�¼ê³ í•´ì„�í• ìˆ˜ ìžˆê³ ë‹¤ì‹œ ë§�하면 '변수 p를 int형ì�„ 가리키는 í�¬ì�¸í„°ë¡œ ì„ ì–¸í•œë‹¤'ë�¼ê³ í• ìˆ˜ 있습니
다. 여기서 ìž ê¹� 샛길로 ë¹ ì ¸ì„œ í�¬ì�¸í„° ì—°ì‚°ìž�(*) ë˜�는 참조 ì—°ì‚°ìž�(&)는 변수 형 (int)ì—� ë¶™ì�´ëŠ” 것 보다 변수(p)ì—� ë¶™ì�´ëŠ”ê²ƒì�´ í•ìƒ�
좋습니다. 왜ëƒ�하면 다ì�Œê³¼ ê°™ì�€ ì„ ì–¸ë¬¸ì�„ 사용하면서 ì‹¤ìˆ˜í• ë§Œí•œ 소지를 ì—†ì• ì£¼ê¸° 때문입니다. (ì—ìž�주: ì°¸ê³ ë¡œ C++ 창시ìž�ì�¸ Bjarne
Stroustrup는 변수 형ì—� ë¶™ì�´ëŠ”ê±¸ ë�” ì„ í˜¸í•œë‹¤ê³ í–ˆë‹µë‹ˆë‹¤.) (추가: 단순히 B. S.는 ì�´ê±¸ ì„ í˜¸í–ˆë‹¤ê³ í•˜ë�”ë�¼ëŠ” 무책임한 언급만 남기ê³
ìž�세한 설명ì�„ 첨가하지 못해서 죄송합니다. 다ì�Œì�˜ ë§�í�¬ë¥¼ 참조하시면 ë�” ìž�세한 ì�´ìœ 를 보실 수 있으실 ê²�니다. http://www.research.att.com/~bs/bs_faq2.html#whitespace )
int* p,q;
위ì�˜ ì„ ì–¸ë¬¸ì�„ 처ì�Œ 보게 ë�˜ë©´ 변수 p와 변수 qê°€ 마치 int를 가리키는 í�¬ì�¸í„°í˜• (int *) 변수로 ì„ ì–¸ë�œ 것 처럼 보입니다. 하지만 사실
변수 pë§Œ int를 가리키는 í�¬ì�¸í„°í˜•으로 ì„ ì–¸ë�˜ì—ˆê³ 변수q는 int형으로 ì„ ì–¸ë�œ 것입니다. (ì—ìž�주: int *p; int *q; 처럼 ê°�ê°� 따로 ì„ ì–¸
하는게 ì�˜ë¯¸ê°€ 분명히 ì „ë‹¬ë�˜ê³ ì†�íŽ¸í•˜ê² ìŠµë‹ˆë‹¤.)
우리는 ë˜�한 í�¬ì�¸í„°ë¥¼ 가리키는 í�¬ì�¸í„°ë¥¼ ì„ ì–¸í• ìˆ˜ 있습니다.
char **argv;
ì›�리만 ë”°ì§€ìž�ë©´ ì�´ 관계는 무한히 반복ë� 수 있습니다. ë”°ë�¼ì„œ 우리는 float형ì�„ 가리키는 í�¬ì�¸í„°ë¥¼ 가리키는 í�¬ì�¸í„°ë¥¼ 가리키는 í�¬ì�¸
터를 ì„ ì–¸í• ìˆ˜ë�„ 있습니다. 몇 단계 ë�” 반복해ë�„ ë�©ë‹ˆë‹¤.
다ì�Œê³¼ ê°™ì�€ ì„ ì–¸ë¬¸ë“¤ì�„ 봅시다. (ì—ìž�주: 여기서 부터는 ì„ ì–¸ë¬¸ í•´ì„� ì›�문ì�„ 괄호안ì—� 넣습니다. ì„ ì–¸ë¬¸ì�„ 한글로 표현하기가 ì�´ë ‡ê²Œ
ì–´ë µêµ°ìš”.)
int *q5;
변수 p는 int형� 요소로 하는 �기가 4� 배열� 가리키는 ��터(a pointer to an array of 4 ints)�며, 변수 q는 int형 ��터를 요
소로 하는 �기가 5� 배열(an array of 5 pointer to integers) 입니다.
const ìˆ˜ì •ìž�는 변수가 변경ë�˜ëŠ” 것ì�„ 금지 (변수 <-> ë³€ê²½í• ìˆ˜ 없다? 모순ì�´êµ°ìš” ) 하기 위해서 사용하는 키워드입니다. const 변수
를 ì„ ì–¸í•˜ëŠ” 경우 ì„ ì–¸ë¬¸ì—�서 바로 초기화를 í•´ì¤�니다. 변경ì�´ 불가능하기 때문ì—� ì„ ì–¸ë¬¸ 외ì—�서는 ê°’ì�„ ì´ˆê¸°í™”í• ìˆ˜ ì—†ê² ì£ .
const int n = 5;
int const m = 10;
위ì�˜ ì˜ˆì œì�˜ ë‘� 변수 nê³¼ mì�€ 똑같ì�´ const ì •ìˆ˜í˜•ìœ¼ë¡œ ì„ ì–¸ë�˜ì—ˆìŠµë‹ˆë‹¤. C++ 표준ì—�서 ë‘�가지 ì„ ì–¸ì�´ 모ë‘� ê°€ëŠ¥í•˜ë‹¤ê³ ë‚˜ì™€ìžˆìŠµë‹ˆë§Œ ê°œ
ì�¸ì �으로는 constê°€ ê°•ì¡°ë�˜ì–´ì„œ ì�˜ë¯¸ê°€ ë�” 분명한 첫번째 ì„ ì–¸ë¬¸ì�„ ì„ í˜¸í•©ë‹ˆë‹¤.
constê°€ í�¬ì�¸í„°ì™€ ê²°í•©ë�˜ë©´ 조금 복잡해집니다. 예를 들어서 다ì�Œê³¼ ê°™ì�€ 변수 p, qê°€ ì„ ì–¸ë�˜ì—ˆìŠµë‹ˆë‹¤.
const int *p;
int const *q;
그럼 여기서 퀴즈, const int형� 가리키는 ��터와 int형� 가리키는 const ��터를 구별해보세요.
사실 ë‘� 변수 모ë‘� const int를 가리키는 í�¬ì�¸í„°ìž…니다. int 형ì�„ 가리키는 const í�¬ì�¸í„°ëŠ” 다ì�Œê³¼ ê°™ì�´ ì„ ì–¸ë�©ë‹ˆë‹¤.
int * const r = &n; // n ì�€ int형 변수로 ì„ ì–¸ ë�˜ì—ˆìŠ´
위ì—�서 p와 q는 const int형 변수ì�´ê¸° 때문ì—� *p 나 *qì�˜ ê°’ì�„ ë³€ê²½í• ìˆ˜ 없습니다. rì�€ const í�¬ì�¸í„°ì�´ê¸° 때문ì—� ì�¼ë‹¨ 위와 ê°™ì�´ ì„ ì–¸
ë�œ 후ì—� 다시 r = &m ê³¼ ê°™ì�´ 다른 주소값ì�„ í• ë‹¹í•˜ëŠ” 것ì�´ 불가능합니다. (ë¬¼ë¡ mì�€ ë˜� 다른 int형 변수ì�´ê² ì£ ) ë¬¼ë¡ ì�´ 경우 *rì�˜
값� 변경� 가능합니다.
위ì—�서 나온 ë‘� 가지 ì„ ì–¸ë¬¸ì�„ 결합하여 const int 형ì�„ 가리키는 const í�¬ì�¸í„°ë¥¼ ì„ ì–¸í•˜ë ¤ê³ í•˜ë©´ 다ì�Œê³¼ 같습니다.
const int * const p = &n; // nì�€ const int형 변수로 ì„ ì–¸ë�˜ì—ˆìŠ´
다ì�Œì—� 나열한 ì„ ì–¸ë¬¸ë“¤ì�„ 보시면 const를 어떻게 í•´ì„�í• ìˆ˜ 있는지 ë�” 분명하게 아실 수 있ì�„ê²�니다. ì�´ 중ì—� 몇몇 ì„ ì–¸ë¬¸ì�€ ì„ ì–¸í•˜ë©´
서 ë�™ì‹œì—� 초기화해줘야만 컴파ì�¼ í• ìˆ˜ 있는ë�° 여기서는 쉽게 ì�´í•´í• 수 있ë�„ë¡� ìƒ�략하였습니다. (컴파ì�¼ 안ë�œë‹¤ê³ ë”´ì§€ ì‚¬ì ˆ)
char ** p1; // pointer to pointer to char
const char **p2; // pointer to pointer to const char
char * const * p3; // pointer to const pointer to char
const char * const * p4; // pointer to const pointer to const char
char ** const p5; // const pointer to pointer to char
const char ** const p6; // const pointer to pointer to const char
char * const * const p7; // const pointer to const pointer to char
const char * const * const p8; // const pointer to const pointer to const char
typedef는 typedef는 "* ë˜�는 &ê°€ 형ì�´ 아닌 변수ì—� ì �ìš©ë�œë‹¤"ë�¼ëŠ” 규칙ì�„ 극복하게 í•´ì¤�니다. 다ì�Œê³¼ ê°™ì�´ typedef 를 사용하게 ë�˜ë©´
typedef char * PCHAR;
PCHAR p,q;
변수 p, q 모ë‘� char를 가리키는 í�¬ì�¸í„° 변수가 ë�©ë‹ˆë‹¤. typedefê°€ 사용ë�˜ì§€ 않았다면 q는 char를 가리키는 í�¬ì�¸í„° 변수가 아니ë�¼ char 형 변수였ì�„ í…�ë�° 솔ì§�히 ì�´ëŸ° 사실ì�„ 모르는 경우 실수하기 쉽ìƒ�ì�´ì£ .
아래ì—� typedef를 사용한 ì„ ì–¸ë¬¸ë“¤ì�„ 설명과 함께 나열해봅니다.
typedef char * a; // a is a pointer to a char
//
// a는
// char형� 가리키는 ��터
typedef a b(); // b is a function that returns
// a pointer to a char
//
// b는
// char형� 가리키는 ��터를 리턴하는
// 함수
typedef b *c; // c is a pointer to a function
// that returns a pointer to a char
//
// c는
// char형� 가리키는 ��터� 리턴하는
// 함수를 가리키는
// ��터
typedef c d(); // d is a function returning
// a pointer to a function
// that returns a pointer to a char
//
// d는
// char형� 가리키는 ��터를 리턴하는
// 함수를 가리키는
// ��터를 리턴하는
// 함수
typedef d *e; // e is a pointer to a function
// returning a pointer to a
// function that returns a
// pointer to a char
//
// e는
// char형� 가리키는 ��터를 리턴하는
// 함수를 가리키는
// ��터를 리턴하는
// 함수를 가리키는
// ��터
e var10; // var is an array of 10 pointers to
// functions returning pointers to
// functions returning pointers to chars.
//
// var는
// char형� 가리키는 ��터를 리턴하는
// 함수를 가리키는
// ��터를 리턴하는
// 함수를 가리키는
// ��터를 요소로하는 �기 10� 배열
typedef는 보통 아래ì—� 나열한것과 ê°™ì�´ struct는 ì„ ì–¸ê³¼ ê°™ì�´ 사용ë�©ë‹ˆë‹¤. 다ì�Œê³¼ ê°™ì�€ struct ì„ ì–¸ë¬¸ì�„ 사용하면 C++ ë¿�ë§Œ 아니ë�¼ Cì—�
서ë�„ struct를 ìƒ�ëžµí• ìˆ˜ 있습니다.
typedef struct tagPOINT
{
int x;
int y;
}POINT;
POINT p; /* C ì—�서ë�„ ìœ íš¨ */
아마ë�„ ì„ ì–¸ë¬¸ì�„ í•´ì„�하는ë�° 있어서 가장 혼ë�ˆì�„ 초래하는 것ì�€ 함수 í�¬ì�¸í„°ì�¼ 것입니다. 함수 í�¬ì�¸í„°ëŠ” DOS ì‹œì ˆì—� 백그ë�¼ìš´ë“œ ìƒ�주 프
로그램(TSR)ì�„ 작성하는ë�° 사용ë�˜ê¸°ë�„ í–ˆê³ Win32나 X-Windows서는 callback 함수를 작성하는ë�° 주로 사용ë�©ë‹ˆë‹¤. ì�´ 외ì—�ë�„ ë§Žì�€ ê³³ì—�
서 함수 í�¬ì�¸í„°ê°€ 사용ë�©ë‹ˆë‹¤. 예를 들ìž�ë©´ ê°€ìƒ� 함수 í…Œì�´ë¸”, STLì�˜ ì�¼ë¶€ 템플릿 ê·¸ë¦¬ê³ Win NT/2K/XPì�˜ 시스템 서비스ì—�서 사용ë�˜ëŠ”
것 ì�„ ë³¼ 수 있습니다. 그럼 간단한 ì˜ˆì œë¶€í„° ì‹œìž‘í•´ë³´ê² ìŠµë‹ˆë‹¤.
int (*p)(char);
위ì�˜ ì„ ì–¸ë¬¸ì�€ 변수 p를 char를 ìž…ë ¥ ì�¸ìž�로 í•˜ê³ int를 리턴하는 함수를 가리키는 í�¬ì�¸í„°(a pointer to a function that takes a char
argument and return an int)로 ì„ ì–¸í•©ë‹ˆë‹¤.
ë‘�ê°œì�˜ float를 ìž…ë ¥ì�¸ìž�로 í•˜ê³ char를 가리키는 í�¬ì�¸í„°ë¥¼ 가리키는 í�¬ì�¸í„°ë¥¼ 리턴하는 함수를 가리키는 í�¬ì�¸í„°(a pointer to a
function that take two floats and returns a pointer to a pointer to a char)는 다ì�Œê³¼ ê°™ì�´ ì„ ì–¸í•©ë‹ˆë‹¤.
char ** (*p)(float, float);
ê·¸ë ‡ë‹¤ë©´ char를 가리키는 const í�¬ì�¸í„° ë‘�개를 ìž…ë ¥ ì�¸ìž�로 ë°›ê³ void í�¬ì�¸í„°ë¥¼ 리턴하는 함수를 가리키는 í�¬ì�¸í„°ë¥¼ 요소로하는 í�¬ê¸° 5ì�˜ ë°°ì—´
(an array of 5 pointers to functions that receive two const pointers to chars and return void pointer)ì�€ 어떻게 ì„ ì–¸í•˜ë©´ ë� 까요
?
void * (*a5)(char * const, char * const);
ì�´ 규칙ì�€ 매우 간단하지만 ì–´ë– í•œ 복잡한 ì„ ì–¸ë¬¸ì�´ë�¼ë�„ í•´ì„�í• ìˆ˜ 있게해ì¤�니다.
ì„ ì–¸ë¬¸ì�€ 가장 안쪽ì�˜ 괄호부터 ì�½ê¸° 시작한다. 괄호안ì—�서 가장 오른쪽부터 시작해서 왼쪽으로 ì�½ê¸° 시작합니다. ì�´ 때 괄호가 발견ë�˜
ë©´ 순서가 바뀌어야 합니다. (ì—ìž� 주: "순서가 ë°”ë€�다"ê°€ ì •í™•ížˆ ì�˜ë¯¸í•˜ëŠ” 바를 파악하기가 ì–´ë µìŠµë‹ˆë‹¤. ì œ ì§�ìž‘ì—�는 함수 ìž…ë ¥ì�¸ìž�를 í�¬í•¨í•˜ëŠ” 괄호안ì—�서는 왼쪽ì—�서 오른쪽으로 ìž…ë ¥ì�¸ìž�들ì�„ ì�½ëŠ”ë‹¤ë�¼ëŠ” ì�˜ë¯¸ê°€ ì•„ë‹�까 싶습니다). 괄호안ì�˜ ëª¨ë“ ë‚´ìš©ì�´ í•´ì„�ë�˜ì—ˆìœ¼ë©´ 괄호 밖으로 í•´ì„�ì�„ 확
대합니다. ëª¨ë“ ì„ ì–¸ë¬¸ì�´ í•´ì„�ë� 때 까지 ì�´ ê³¼ì •ì�„ 반복합니다.
"Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the
direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole
declaration has been parsed."
오른쪽ì—�서 왼쪽으로 ì�½ê¸° 규칙ì—�서 ìž‘ì�€ 변경 사í•: ì„ ì–¸ë¬¸ì�„ 처ì�Œìœ¼ë¡œ ì�½ê¸° ì‹œìž‘í• ë•Œì—�는 가장 안쪽ì�˜ 괄호부터 ì�½ê¸° 시작하는게 ì•„
니� 변수 �름 부터 �기 시작합니다.
다ì�Œ ì„ ì–¸ë¬¸ì�„ 첫 번째 ì˜ˆì œë¡œ 설명합니다.
int * (* (*fp1) (int) ) 10;
1. 변수 �름부터 시작합니다. --- fp1�
2. 오른쪽ì—� ) ë§�ê³ ëŠ” 아무것ë�„ 없으니까 왼쪽ì�„ ë³´ë©´ *ê°€ 있네요 --- í�¬ì�¸í„°ìž…니다. ì�´ í�¬ì�¸í„°ëŠ” 3.ì�„ 가리킵니다.
3. 괄호를 벗어나서 오른쪽ì�„ ë³´ë©´ (int)ê°€ 있습니다. --- 함수ì�¸ë�° int를 ìž…ë ¥ ì�¸ìž�로 받는군요.
4. 왼쪽으로 가면 *가 있습니다. - � 함수는 ��터를 리턴하는� � ��터는 4.를 가리킵니다.
5. 괄호를 벗어나서 오른쪽� 보면 10 � 있습니다. --- �기가 10� 배열입니다.
6. 왼쪽� 보면 *가 있습니다. --- 배열� 요소는 ��터�� � ��터는 7.를 가리킵니다.
7. � 왼쪽� 보면 int가 있습니다. --- ��터가 int형� 가리킵니다.
어순ì�´ 달ë�¼ì„œ ì˜�어로 표현하는 것보다 한글로 표현하기 무지 힘ë“니다. 위ì�˜ ë‚´ìš©ì�„ 종합하면 다ì�Œê³¼ 같습니다.
"fp1ì�€ int형ì�„ 가리키는 í�¬ì�¸í„°ë¥¼ 요소로 하는 í�¬ê¸°ê°€ 10ì�¸ ë°°ì—´ì�„ 가리키는 í�¬ì�¸í„°ë¥¼ 리턴하면서 int를 ìž…ë ¥ ì�¸ìž�로 받는 함수를 가리
키는 ��터"입니다.
1. Start from the variable name -------------------------- fp1
2. Nothing to right but ) so go left to find * -------------- is a pointer
3. Jump out of parentheses and encounter (int) --------- to a function that takes an int as argument
4. Go left, find * ---------------------------------------- and returns a pointer
5. Jump put of parentheses, go right and hit 10 -------- to an array of 10
6. Go left find * ----------------------------------------- pointers to
7. Go left again, find int -------------------------------- ints.
다ì�Œì�€ ë‘� 번째 ì˜ˆì œìž…ë‹ˆë‹¤.
int *( *( *arr5)())();
1. 변수 �름부터 시작합니다. --- arr�
2. 오른쪽� 보면 5가 있습니다. --- �기가 5� 배열입니다.
3. 왼쪽� 보면 *가 있습니다. --- 배열� 요소는 ��터�� 4.를 가리킵니다.
4. 괄호를 벗어나서 오른쪽ì�„ ë³´ë©´ ()ê°€ 있습니다. --- 함수ì�¸ë�° ìž…ë ¥ì�¸ìž�를 아무것ë�„ 받지 않습니다.
5. 왼쪽� 보면 *가 있습니다. --- 함수는 ��터를 리턴하는� ��터는 6.� 가리킵니다.
6. 괄호를 벗어나서 오른쪽ì�„ ë³´ë©´ ()ê°€ 있습니다. --- 함수ì�¸ë�° ìž…ë ¥ì�¸ìž�를 아무것ë�„ 받지 않습니다.
7. 왼쪽� 보면 *가 있습니다. --- 함수는 ��터를 리턴하는� ��터는 8.� 가리킵니다.
8. � 왼쪽� 보면 int가 있습니다. --- ��터가 int형� 가리킵니다.
"arrì�€ int형ì�„ 가리키는 í�¬ì�¸í„°ë¥¼ 리턴하면서 ìž…ë ¥ì�¸ìž�로 아무것ë�„ 받지 않는 함수를 가리키는 í�¬ì�¸í„°ë¥¼ 리턴하면서 ìž…ë ¥ì�¸ìž�로 아무것
� 받지 않는 함수를 가리키는 ��터를 요소로 하는 �기가 5� 배열"입니다.
1. Start from the variable name --------------------- arr
2. Go right, find array subscript --------------------- is an array of 5
3. Go left, find * ----------------------------------- pointers
4. Jump out of parentheses, go right to find () ------ to functions
5. Go left, encounter * ----------------------------- that return pointers
6. Jump out, go right, find () ----------------------- to functions
7. Go left, find * ----------------------------------- that return pointers
8. Continue left, find int ----------------------------- to ints.
(ì—ìž� 주: 여기서 ì§�ì—ì�€ ì œê°€ 오른쪽-왼쪽 규칙ì�„ ë”°ë�¼ê°€ë³´ë©´ì„œ ì§�ì ‘ 쓴것ì�´ê³ ì�˜ì—ì�€ ì§�ì—ì—� 근거해서 나름대로 í•´ì„�ì�„ 한글 어순ì—�
맞게 다시 쓴것입니다.)
float ( * ( *b()) [] )(); // b is a function that returns a
// pointer to an array of pointers
// to functions returning floats.
//
// (ì§�ì—) b는 함수ì�¸ë�° í�¬ì�¸í„°ë¥¼ 리턴합니다.
// � ��터는 배열� 가리키는� 배열� 요소는 ��터입니다.
// � ��터는 함수를 가리키는� � 함수는 float를 리턴합니다.
//
// (ì�˜ì—) b는 float를 리턴하는 함수를
// 가리키는 ��터를 요소로하는 배열� 가리키는 ��터를
// 리턴하는 함수입니다.
void * ( *c) ( char, int (*)()); // c is a pointer to a function that takes
// two parameters:
// a char and a pointer to a
// function that takes no
// parameters and returns
// an int
// and returns a pointer to void.
//
// (ì§�ì—) c는 í�¬ì�¸í„°ì�¸ë�° ì�´ í�¬ì�¸í„°ëŠ” 함수를 가리킵니다.
// � 함수는 char형과
// int형ì�„ 리턴하는 함수를 가리키는 í�¬ì�¸í„°ë¥¼ ìž…ë ¥ì�¸ìž�로 합니다.
// � 함수는 ��터를 리턴는� � ��터는 void를 가리킵니다.
//
// (ì�˜ì—) c는 void를 가리키는 í�¬ì�¸í„°ë¥¼ 리턴하면서
// char형과 int를 리턴하는 함수를 가리키는 í�¬ì�¸í„°ë¥¼ ìž…ë ¥ì�¸ìž�로 가지는
// 함수를 가리키는 ��터입니다.
void ** (*d) (int &,
char **(*)(char *, char **)); // d is a pointer to a function that takes
// two parameters:
// a reference to an int and a pointer
// to a function that takes two parameters:
// a pointer to a char and a pointer
// to a pointer to a char
// and returns a pointer to a pointer
// to a char
// and returns a pointer to a pointer to void
//
// (ì§�ì—) d는 í�¬ì�¸í„°ì�¸ë�° ì�´ í�¬ì�¸í„°ëŠ” 함수를 가리킵니다.
// � 함수는 int형� 참조와 함수를 가리키는 ��터를 ��로 가집니다.
// � ��터가 가리키는 함수는
// char를 가리키는 ��터와
// char를 가리키는 ��터를 가리키는 ��터를 ��로 가지면서
// char를 가리키는 ��터를 가리키는 ��터를 리턴합니다.
// � 함수는 void를 가리키는 ��터를 가리키는 ��터를 리턴합니다.
//
// (ì�˜ì—) d는 void를 가리키는 í�¬ì�¸í„°ë¥¼ 가리키는 í�¬ì�¸í„°ë¥¼ 리턴하면서
// int형� 참조와
// char를 가리키는 ��터와
// char를 가리키는 ��터를 가리키는 ��터를 ��로 가지면서
// char를 가리키는 ��터를 가리키는 ��터를 리턴하는
// 함수를 ��로 하는 함수를
// 가리키는 ��터입니다.
// ì•…~~~
float ( * ( * e10)
(int &) ) 5; // e is an array of 10 pointers to
// functions that take a single
// reference to an int as an argument
// and return pointers to
// an array of 5 floats.
//
// (ì§�ì—) e는 í�¬ê¸°ê°€ 10ì�¸ ë°°ì—´ì�¸ë�° ê·¸ 요소는 í�¬ì�¸í„°ìž…니다.
// ì�´ í�¬ì�¸í„°ëŠ” 함수를 가리키는ë�° 함수는 int형 참조를 ìž…ë ¥ìœ¼ë¡œ 받으면서
// ��터를 리턴합니다.
// � ��터는 �기가 5� 배열� 가리키는� 배열� 요소는 float입니다.
//
// (ì�˜ì—) e는 floatì�„ 요소로 하는 í�¬ê¸°ê°€ 5ì�¸ ë°°ì—´ì�„ 가리키는
// ��터를 리턴하면서
// int형 참조를 ìž…ë ¥ì�¸ìž�로 하는 함수를 가리키는 í�¬ì�¸í„°ë¥¼ 요소로하는
// �기가 10� 배열입니다.
ì›�문ì—�서는 설명ì�´ 없었지만 í�´ëž˜ìФ 멤버 함수 í�¬ì�¸í„°ì�˜ 경우ì—�ë�„ 똑같ì�€ 규칙ì�´ ì �ìš©ë� 수 있다는걸 알 수 있습니다. ì›�문ì—� 달린 답글
중ì—�서 ì˜ˆì œë¥¼ 복사해왔습니다.
// that takes no argument and return an int
//
// (ì§�ì—) p는 í�¬ì�¸í„°ì�¸ë�° ì�´ í�¬ì�¸í„°ëŠ” CFoo í�´ëž˜ìФì�˜ 멤버함수를 가리킵니다.
// ì�´ 멤버함수는 아무런 ìž…ë ¥ì�¸ìž�ë�„ 받지 ì•Šê³ int를 리턴해ì¤�니다.
//
// (ì�˜ì—) p는 아무런 ìž…ë ¥ì�¸ìž�ë�„ 받지 ì•Šê³ int를 리턴해주는
// CFoo �래스� 멤버 함수를 가리키는 ��터입니다.
ê°™ì�€ ë§¥ë�½ìœ¼ë¡œ 호출규약ì�´ 들어간 경우ì—�ë�„ 똑같ì�€ 규칙ì�„ ì �용합니다.
int (__stdcall* q)(); // q is a pointer to a __stdcall function
// that takes no argument and return int
//
// (ì§�ì—) q는 í�¬ì�¸í„°ì�¸ë�° ì�´ í�¬ì�¸í„°ëŠ” __stdcall 함수를 가리킵니다.
// ì�´ 함수는 아무런 ìž…ë ¥ì�¸ìž�ë�„ ë°›ì§€ì•Šê³ int를 리턴해ì¤�니다.
//
// (ì�˜ì—) q는 아무런 ìž…ë ¥ì�¸ìž�ë�„ ë°›ì§€ì•Šê³ int를 리턴해주는
// __stdcall 함수를 가리키는 ��터입니다.
|}}
|}}










