15-2-³ª.ÇÔ¼ö Æ÷ÀÎÅÍ Å¸ÀÔ

ÇÔ¼ö Æ÷ÀÎÅÍ Å¸ÀÔµµ ÀÏÁ¾ÀÇ °íÀ¯ÇÑ Å¸ÀÔÀÌ´Ù. µû¶ó¼­ ¿øÇüÀÌ ´Ù¸¥ ÇÔ¼ö Æ÷ÀÎÅͳ¢¸®´Â °ð¹Ù·Î ´ëÀÔÇÒ ¼ö ¾øÀ¸¸ç ÇÔ¼öÀÇ Àμö·Îµµ ³Ñ±æ ¼ö ¾ø´Ù. Á¤¼öÇü Æ÷ÀÎÅÍ º¯¼ö(int *)¿¡ ½Ç¼öÇü Æ÷ÀÎÅÍ º¯¼ö(double *)ÀÇ °ªÀ» ´ëÀÔÇÒ ¼ö ¾øµíÀÌ ¸»ÀÌ´Ù. ´ÙÀ½ Äڵ带 º¸ÀÚ.

 

int (*pf1)(char *);

void (*pf2)(double);

pf1=pf2;                  // ŸÀÔÀÌ ´Ù¸£¹Ç·Î ¿¡·¯

 

pf1Àº ¹®ÀÚÇü Æ÷ÀÎÅ͸¦ Àμö·Î ÃëÇÏ°í Á¤¼öÇüÀ» ¸®ÅÏÇÏ´Â ÇÔ¼ö¸¦ °¡¸®Å°´Â ÇÔ¼ö Æ÷ÀÎÅÍÀ̸ç pf2´Â ½Ç¼ö¸¦ Àμö·Î ÃëÇÏ°í ¸®ÅÏ°ªÀÌ ¾ø´Â ÇÔ¼ö¸¦ °¡¸®Å°´Â ÇÔ¼ö Æ÷ÀÎÅÍÀÌ´Ù. µÎ º¯¼ö°¡ °¡¸®Å³ ¼ö ÀÖ´Â ÇÔ¼öÀÇ ¿øÇüÀÌ ´Ù¸£±â ¶§¹®¿¡ pf2°¡ °¡¸®Å°´Â ¹øÁö¸¦ pf1¿¡ °ð¹Ù·Î ´ëÀÔÇÒ ¼ö ¾ø´Ù. ¸¸¾à ÀÌ°ÍÀÌ °¡´ÉÇÏ´Ù¸é pf1·Î ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§ ÄÄÆÄÀÏ·¯´Â char *ÇüÀÇ Àμö¸¦ ãÁö¸¸ pf1ÀÌ °¡¸®Å°´Â ÇÔ¼ö´Â doubleÇüÀÇ Àμö¸¦ ¹Þ¾ÆµéÀ̹ǷΠºÒÀÏÄ¡°¡ ¹ß»ýÇϸç ÇÔ¼ö°¡ Á¦´ë·Î È£ÃâµÇÁö ¾ÊÀ» °ÍÀÌ´Ù.

ÇÔ¼ö Æ÷ÀÎÅÍ°¡ °¡¸®Å³ ¼ö ÀÖ´Â ¿øÇü°ú °°Áö ¾ÊÀº ÇÔ¼öÀÇ ¹øÁö¸¦ ´ëÀÔÇÏ´Â °Íµµ ¶È°°Àº ÀÌÀ¯·Î ¿¡·¯·Î 󸮵ȴÙ. ´ÙÀ½ Äڵ忡¼­ pf3Àº ¹®ÀÚÇü Æ÷ÀÎÅÍ¿Í ½Ç¼ö¸¦ Àμö·Î ÃëÇÏ°í ¸®ÅÏ°ªÀÌ ¾ø´Â ÇÔ¼ö¸¦ °¡¸®Å°µµ·Ï ¼±¾ðÇߴµ¥ func ÇÔ¼ö´Â pf3ÀÇ ¿øÇü°ú ´Ù¸£¹Ç·Î pf3¿¡ func ÇÔ¼öÀÇ ¹øÁö¸¦ ´ëÀÔÇÒ ¼ö ¾ø´Ù.

 

int func(int a);

 

void (*pf3)(char *, double);

pf3=func;                         // ¿¡·¯

 

±×·¯³ª ŸÀÔÀÌ ´Ù¸¥ ÇÔ¼ö Æ÷ÀÎÅͳ¢¸®¶óµµ °­Á¦·Î ´ëÀÔÇÒ ¼ö´Â Àִµ¥ ÀÌ°ÍÀÌ ÀÏ´ÜÀº °¡´ÉÇØ¾ß ÇÑ´Ù. void Æ÷ÀÎÅÍ¿¡ ÀúÀåµÈ ÇÔ¼öÀÇ ¹øÁö¸¦ ´ëÀԹ޴´ٰųª ÀÚ·á ±¸Á¶ ¼³°è½Ã¿¡ ¹Ì¸® ¾Ë ¼ö ¾ø´Â ÇÔ¼ö¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ´Ù·ç°íÀÚ ÇÒ ¶§ÀÌ´Ù. ÀÌ·² ¶§ »ç¿ëÇÏ´Â °ÍÀÌ ¹Ù·Î ij½ºÆ® ¿¬»êÀÚÀÌ¸ç ¿©·¯ °¡Áö ÀÌÀ¯·Î °­Á¦ ij½ºÆÃÀÇ Çʿ伺Àº ´©±¸³ª ÀÎÁ¤ÇÏ°í ÀÖ´Ù. int *pi¿Í double *pd°¡ ÀÖÀ» ¶§ pi=pd ´ëÀÔÀº ±ÝÁöµÇÁö¸¸ pi=(int *)pd´Â °¡´ÉÇÑ °Íó·³ ÇÔ¼ö Æ÷ÀÎÅ͵µ ŸÀÔ¿¡ ¸Â°Ô ij½ºÆÃÇÏ¸é °­Á¦·Î ´ëÀÔÇÒ ¼ö ÀÖ´Ù.

µ¥ÀÌÅÍ Æ÷ÀÎÅÍ¿¡¼­¿Í ¸¶Âù°¡Áö·Î ÇÔ¼ö Æ÷ÀÎÅÍ¿¡µµ ij½ºÆ® ¿¬»êÀÚ¸¦ ¾µ ¼ö Àִµ¥ ¹®Á¦´Â ÇÔ¼ö Æ÷ÀÎÅÍÀÇ Ä³½ºÆ® ¿¬»êÀÚ°¡ ¸ð¾çÀÌ »ý¼ÒÇؼ­ Á¶±Ý ¾î·Æ´Ù´Â °ÍÀÌ´Ù. ÇÔ¼ö Æ÷ÀÎÅʹ ŸÀÔ ÀÚü°¡ ±æ±â ¶§¹®¿¡ ij½ºÆ® ¿¬»êÀÚÀÇ ¸ð¾çµµ »ó´çÈ÷ º¹ÀâÇØ º¸ÀδÙ. ´ÙÀ½ ÄÚµå´Â pf2¸¦ pf1¿¡ °­Á¦·Î ´ëÀÔÇϱâ À§ÇØ Ä³½ºÆ® ¿¬»êÀÚ¸¦ »ç¿ëÇÑ °ÍÀÌ´Ù.

 

int (*pf1)(char *);

void (*pf2)(double);

pf1=(int (*)(char *))pf2;

 

ÀÌ ½Ä¿¡¼­ (int (*)(char *))°¡ ij½ºÆ® ¿¬»êÀÚÀÌ´Ù. ÇÔ¼ö Æ÷ÀÎÅÍÇüÀÇ Ä³½ºÆ® ¿¬»êÀÚ¸¦ ¸¸µå´Â ¹æ¹ýÀº ÇÔ¼ö Æ÷ÀÎÅÍ ¼±¾ð½Ä¿¡¼­ º¯¼ö¸íÀ» »©°í Àüü¸¦ °ýÈ£·Î ÇÑ ¹ø ´õ ½ÎÁÖ¸é µÈ´Ù. ÀÏÁ¾ÀÇ °ø½ÄÀ̹ǷΠ¿Ü¿ö µÎ°Å³ª ¾Æ´Ï¸é ÇÊ¿äÇÒ ¶§¸¶´Ù ÀÌ °ø½ÄÀ» ã¾Æº¸±â ¹Ù¶õ´Ù.

pf1=(int (*)(char *))pf2 ´ëÀÔ¹®Àº pf2°¡ °¡¸®Å°´Â ¹øÁö¸¦ ¹®ÀÚÇü Æ÷ÀÎÅ͸¦ Àμö·Î ÃëÇÏ°í Á¤¼ö¸¦ ¸®ÅÏÇÏ´Â ÇÔ¼ö Æ÷ÀÎÅÍ Å¸ÀÔÀ¸·Î Àá½Ã ¹Ù²Û ÈÄ pf1¿¡ ´ëÀÔÇÑ´Ù. pf3¿¡ func ÇÔ¼öÀÇ ¹øÁö¸¦ °­Á¦·Î ´ëÀÔÇÒ ¶§µµ ¸¶Âù°¡Áö·Î ij½ºÆ® ¿¬»êÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ÀÌ·¸°Ô °­Á¦·Î ´ëÀÔÇßÀ» ¶§ÀÇ ºÎÀÛ¿ë¿¡ ´ëÇؼ­´Â ½º½º·Î Ã¥ÀÓÁ®¾ß ÇÑ´Ù.

 

pf3=(void (*)(char *,double))func;

 

ij½ºÆ® ¿¬»êÀÚ°¡ ±æ¾î º¸¿©¼­ ±×·¸Áö ¿ø¸®¸¦ ¾Ë°í ³ª¸é º°·Î ¾î·ÆÁö ¾Ê´Ù. ´ÙÀ½Àº Á¶±Ý ÀÌ·ÐÀûÀÎ ¾ê±â°¡ µÇ°ÚÁö¸¸ ÇÔ¼ö Æ÷ÀÎÅÍÀÇ ¹è¿­À̳ª Æ÷ÀÎÅ͸¦ ¼±¾ðÇÏ´Â Çü½Ä¿¡ ´ëÇØ ¾Ë¾Æº¸ÀÚ. TÇü¿¡ ´ëÇØ TÇü ¹è¿­°ú TÇü Æ÷ÀÎÅ͸¦ Ç×»ó ¼±¾ðÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÇÔ¼ö Æ÷ÀÎÅÍ¿¡ ´ëÇؼ­µµ ¹è¿­°ú Æ÷ÀÎÅ͸¦ ¼±¾ðÇÒ ¼ö ÀÖ´Ù. func ŸÀÔÀÇ ÇÔ¼ö¸¦ °¡¸®Å³ ¼ö ÀÖ´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¿ä¼Ò·Î °¡Áö´Â Å©±â 5ÀÇ arpf ¹è¿­Àº ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù.

 

int (*arpf[5])(int);

 

ÇÔ¼ö Æ÷ÀÎÅÍ ¹è¿­À» ¼±¾ðÇÒ ¶§´Â º¯¼ö¸í ´ÙÀ½¿¡ ÷ÀÚ Å©±â¸¦ ¹àÇô ÁÖ¸é µÈ´Ù. À߸ø »ý°¢Çϸé int (*arpf)(int)[5];°¡ ¸ÂÀ» °Í °°±âµµ Çѵ¥ ÷ÀÚ Å©±â´Â ¹Ýµå½Ã º¯¼ö¸í ´ÙÀ½¿¡ ¹Ù·Î ½á¾ß ÇÑ´Ù. ÀÌ ¼±¾ð¿¡ ÀÇÇØ int (*)(int)ÇüÀÇ ÇÔ¼öÀÇ ¹øÁö¸¦ °¡¸®Å³ ¼ö ÀÖ´Â ÇÔ¼ö Æ÷ÀÎÅÍ arpf[0] ~ arpf[4]±îÁö 4°³ÀÇ º¯¼ö°¡ »ý¼ºµÇ¸ç °¢ º¯¼ö´Â int func(int)¿Í °°Àº ¿øÇüÀÇ ÇÔ¼ö¸¦ °¡¸®Å°´Â ¹øÁö¸¦ °¡Áú ¼ö ÀÖ´Ù. µ¿ÀÏÇÑ Å¸ÀÔÀÇ º¯¼öµéÀ» ¹è¿­¿¡ ¸ð¾Æ µÎ¸é ·çÇÁ¸¦ µ¹¸é¼­ ÇÔ¼öµéÀ» ¼ø¼­´ë·Î È£ÃâÇѴٰųª Çϴ ó¸®µµ °¡´ÉÇØÁø´Ù.

´ÙÀ½Àº ÇÔ¼ö Æ÷ÀÎÅÍÀÇ Æ÷ÀÎÅ͸¦ ¼±¾ðÇØ º¸ÀÚ. func ŸÀÔÀÇ ÇÔ¼ö¸¦ °¡¸®Å°´Â ÇÔ¼ö Æ÷ÀÎÅ͸¦ °¡¸®Å°´Â Æ÷ÀÎÅÍ ppf´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇϴµ¥ * ±¸µÎÁ¡¸¸ Çϳª ´õ ÀûÀ¸¸é µÈ´Ù.

 

int (**ppf)(int);

 

ÀÌ·¸°Ô ¼±¾ðµÈ ppf´Â int (*)(int) ŸÀÔÀ¸·Î ¼±¾ðµÈ ÇÔ¼ö Æ÷ÀÎÅÍ º¯¼ö³ª ÇÔ¼ö Æ÷ÀÎÅÍ ¹è¿­À» °¡¸®Å³ ¼ö ÀÖ´Â ÀÌÂ÷ ÇÔ¼ö Æ÷ÀÎÅÍ º¯¼öÀÌ´Ù. ppf=&pf ¶Ç´Â ppf=arpf ½ÄÀ¸·Î ÇÔ¼ö Æ÷ÀÎÅÍ º¯¼öÀÇ ¹øÁö¸¦ ´ëÀÔ¹ÞÀ» ¼ö ÀÖÀ¸¸ç ppf·ÎºÎÅÍ ÇÔ¼ö¸¦ È£ÃâÇÒ ¶§´Â (**ppf)(2) Çü½ÄÀ» »ç¿ëÇÑ´Ù. ÇÔ¼ö Æ÷ÀÎÅÍ ¹è¿­ arpf¿Í ÀÌÁß ÇÔ¼ö Æ÷ÀÎÅÍ ppf°¡ ¸Þ¸ð¸®¿¡ ±¸ÇöµÈ ¸ð¾çÀº ´ÙÀ½°ú °°´Ù.

ÇÔ¼ö Æ÷ÀÎÅÍÀÇ Å¸ÀÔÀº ÇÔ¼ö°¡ ÃëÇÏ´Â ÀμöµéÀÇ Å¸ÀÔ°ú ¸®ÅÏ°ª±îÁö Á¤È®ÇÏ°Ô ¹àÇô¾ß Çϱ⠶§¹®¿¡ ŸÀÔÀÇ Çü½ÄÀÌ ³Ê¹« ±æ¾î¼­ ¾²±â¿¡ ¹ø°Å·Ó´Ù. ¶ÇÇÑ ÇÔ¼ö Æ÷ÀÎÅͷκÎÅÍ ÆÄ»ýµÈ ŸÀÔÀ» ¸¸µå´Â °Íµµ Çò°¥¸®°í »ý¼ÒÇÑ ¸éÀÌ ÀÖ´Ù. ±×·¡¼­ ÇÔ¼ö Æ÷ÀÎÅÍ Å¸ÀÔÀ» ÀÚÁÖ »ç¿ëÇϰųª ÀÚ½ÅÀÌ ¾ø´Ù¸é Á÷Á¢ ŸÀÔÀ» ±â¼úÇÏ´Â °Íº¸´Ù typedef·Î ÇÔ¼ö Æ÷ÀÎÅÍ Å¸ÀÔÀ» µû·Î Á¤ÀÇÇÑ ÈÄ »ç¿ëÇÏ´Â °ÍÀÌ Æí¸®ÇÏ´Ù. int func(int)ÇüÀÇ ÇÔ¼ö¸¦ °¡¸®Å°´Â ŸÀÔÀº ´ÙÀ½°ú °°ÀÌ Á¤ÀÇÇÑ´Ù.

 

typedef int (*PFTYPE)(int);

PFTYPE pf;

 

ÇÔ¼ö Æ÷ÀÎÅ͸¦ ¼±¾ðÇÏ´Â ¹®Àå¿¡¼­ º¯¼ö¸íÀ» ¿øÇϴ ŸÀÔ À̸§À¸·Î ¹Ù²Ù°í ¾Õ¿¡ typedef¸¸ ºÙÀÌ¸é µÈ´Ù. ÀÌÈÄ ÄÄÆÄÀÏ·¯´Â PFTYPEÀ̶ó´Â ¸íĪÀ» int (*)(int) ŸÀÔÀ¸·Î ÀνÄÇϹǷΠPFTYPEÀ¸·Î ÇÔ¼ö Æ÷ÀÎÅÍ º¯¼ö¸¦ ½±°Ô ¼±¾ðÇÒ ¼ö ÀÖÀ¸¸ç ij½ºÆ® ¿¬»êÀڷεµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÇÔ¼ö Æ÷ÀÎÅͷκÎÅÍ ¹è¿­À̳ª Æ÷ÀÎÅÍ°°Àº ÆÄ»ý º¯¼ö¸¦ ¼±¾ðÇÏ´Â °Íµµ ÈξÀ ´õ °£ÆíÇÏ´Ù.

 

PFTYPE arpf[5];

PFTYPE *ppf;

 

¸¶Ä¡ intÇüÀ¸·ÎºÎÅÍ ¹è¿­À̳ª Æ÷ÀÎÅ͸¦ ¼±¾ðÇϵíÀÌ PFTYPEÀ» »ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î Á÷°üÀûÀÌ°í Àб⿡µµ ÁÁ´Ù.