¢Ê 7ÀÏ: ¼±¾ðÀÚ - ÇÔ¼ö ¼±¾ðÀÚ


  ¢¹ A8.5 ¼±¾ðÀÚ (Declarator)

declarator:
        pointer opt   direct-declarator

direct-declarator:
        identifier
        ( declarator )
        direct-declarator [ constant-expression opt ]
        direct-declarator ( parameter-type-list )
        direct-declarator ( identifier-list opt )

pointer:
        * type-qualifier-list opt
        * type-qualifier-list opt   pointer

type-qualifier-list:
        type-qualifier
        type-qualifier-list   type-qualifier

¼±¾ðÀÚÀÇ ±¸Á¶´Â °£Á¢ÁöÁ¤ (indirection), ÇÔ¼ö (function), ¹è¿­¼ö½Ä (array expression) ÀÇ ±¸Á¶¿Í ºñ½ÁÇÕ´Ï´Ù; °áÇÕ¹æ½Ä (grouping) Àº µ¿ÀÏÇÕ´Ï´Ù.

¢¹ A8.6 ¼±¾ðÀÚÀÇ ÀÇ¹Ì (Meaning of Declarator)
  ¼±¾ðÀÚÀÇ ¸®½ºÆ®´Â ÇüÁöÁ¤ÀÚ¿Í ±â¾ïºÎ·ù ÁöÁ¤ÀÚ µÚ¿¡ ³ªÅ¸³³´Ï´Ù. °¢ ¼±¾ðÀÚ´Â Á÷Á¢-¼±¾ðÀÚ (direct-declarator) ÀÇ Ã³À½¿¡ Á¦½ÃµÈ ÇѰ³ÀÇ ÁÖ¿äÇÑ ¸íĪ (identifier) À» ¼±¾ðÇÕ´Ï´Ù. ±â¾ïºÎ·ù ÁöÁ¤ÀÚ´Â ÀÌ ¸íĪ¿¡ Á÷Á¢ Àû¿ëµÇÁö¸¸, µ¥ÀÌÅÍÇüÀº ¼±¾ðÀÚÀÇ ÇüÅ¿¡ ´Þ·Á ÀÖ½À´Ï´Ù. ¼±¾ðÀÚ´Â, ¼±¾ðÀÚÀÇ ¸íĪÀÌ ±× ¼±¾ðÀÚ¿Í µ¿ÀÏÇÑ ÇüÅÂÀÇ ¼ö½Ä¿¡ ³ªÅ¸³µÀ» ¶§, ÁÖ¾îÁø µ¥ÀÌÅÍÇüÀÇ ´ë»óü¸¦ »ý¼ºÇÑ´Ù´Â Àǹ̷ΠÀÌÇØµË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  À§ À̾߱â´Â, ¹®¹ýÀûÀΠǥÇö¿¡¼­ º¸¾ÒÀ» ¶§ C¾ð¾îÀÇ ¼±¾ðÀº ¼ö½Ä¿¡¼­ »ç¿ëµÉ ¶§¿Í µ¿ÀÏÇÑ ÇüŸ¦ °®´Â´Ù´Â ÀǹÌÀÔ´Ï´Ù. ÇÔ¼ö¿Í ¹è¿­À» ¿¹·Î µé¸é ¾Æ·¡¿Í °°½À´Ï´Ù.

int f(double);  /* ¼±¾ðÀÚ f ´Â ÇÔ¼öÀ̸ç, ÀÌ´Â ÇÔ¼ö¸¦ »ç¿ëÇÒ ¶§¿Í µ¿ÀÏÇÑ ¹®¹ýÀû ±¸¼º (°ýÈ£¿Í ÇϳªÀÇ °ª) À» °®½À´Ï´Ù */
f(3.14);  /* ¼±¾ð°ú µ¿ÀÏÇÑ ÇüŸ¦ °®´Â ÇÔ¼ö »ç¿ë. int ÇüÀÌ »ý¼ºµË´Ï´Ù */
 
double a[10];  /* ¼±¾ðÀÚ a ´Â ¹è¿­ÀÔ´Ï´Ù. ´ë°ýÈ£¾È¿¡ ÇϳªÀÇ °ªÀÌ µé¾î°¡ ÀÖ´Â ÇüÅÂÀÔ´Ï´Ù */
a[3];  /* ¼±¾ð°ú µ¿ÀÏÇÑ ÇüŸ¦ °®´Â ¹è¿­ »ç¿ë. double ÇüÀÌ »ý¼ºµË´Ï´Ù */
 

  ¼±¾ð ÁöÁ¤ÀÚ (A8.2) ÀÇ µ¥ÀÌÅÍÇü ºÎºÐ°ú Ưº°ÇÑ ¼±¾ðÀÚ¿¡ ´ëÇØ¼­¸¸ »ý°¢Çغ¸¸é, ¼±¾ðÀº "T D" ÀÇ ÇüŸ¦ °®À¸¸ç, T ´Â µ¥ÀÌÅÍÇü, D ´Â ¼±¾ðÀÚ¸¦ ³ªÅ¸³À´Ï´Ù. ´Ù¾çÇÑ ÇüÅÂÀÇ ¼±¾ðÀÚ¿¡¼­ ¸íĪ¿¡ ¼Ó¼ºÀ» ÁÖ´Â µ¥ÀÌÅÍÇüÀº ÀÌ·¯ÇÑ Ç¥±â¹ýÀ» ÀÌ¿ëÇØ ±Í³³ÀûÀ¸·Î (inductively) ¼­¼úµË´Ï´Ù.
  ¼±¾ð T D ¿¡¼­, D °¡ ¾Æ¹«°Íµµ ºÙÁö¾ÊÀº ¸íĪÀ̶ó¸é, ±× ¸íĪÀÇ µ¥ÀÌÅÍÇüÀº T ÀÔ´Ï´Ù.
  ¼±¾ð T D ¿¡¼­, D °¡
              ( D1 )
°ú °°Àº ÇüŸ¦ °®°í ÀÖ´Ù¸é, D1 ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀº D ¿Í µ¿ÀÏ
ÇÕ´Ï´Ù. °ýÈ£´Â µ¥ÀÌÅÍÇüÀ» ¹Ù²ÙÁö ¸øÇÏÁö¸¸, º¹ÀâÇÑ ¼±¾ðÀÚ¸¦ ¹­´Â ¹æ½ÄÀº ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù.

¢¹ A8.6.1 Æ÷ÀÎÅÍ ¼±¾ðÀÚ (Pointer Declarator)
  ¼±¾ð T D ¿¡¼­,

              * type-qualifier-list opt   D1

D °¡ À§¿Í °°Àº ÇüŸ¦ °®°í, ¼±¾ð T D1 ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀÌ "type-modifier T (T Çüº¯°æÀÚ)" ¶ó¸é, D ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀº "type-modifier type-qualifier-list pointer to T (ÇüÇÑÁ¤¾î TÇü Æ÷ÀÎÅÍ Çüº¯°æÀÚ)" ÀÔ´Ï´Ù. * µÚ¿¡ ÁÖ¾îÁø ÇüÇÑÁ¤¾î´Â Æ÷ÀÎÅͰ¡ °¡¸£Å°´Â ´ë»óü°¡ ¾Æ´Ñ, Æ÷ÀÎÅÍ ÀÚü¿¡ Àû¿ëµË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  µ¥ÀÌÅÍÇüÀ» Àû´Â ºÎºÐÀº ¿ø¹®À» ±×´ë·Î ¿Å±â°í, °ýÈ£¾È¿¡ ¹ø¿ªÀ» Àû¾ú½À´Ï´Ù. ¿µ¾îÀÇ Æ¯¼º»ó ¸Ç¾Õ¿¡ °É¸®´Â Çüº¯°æÀÚ°¡ Çѱ¹¾î·Î ¹ø¿ªÇÒ ¶§´Â ¸Ç µÚ·Î °¡±â ¶§¹®¿¡ ±×·¸°Ô Àû¾îÁÖ´Â µîÀÇ ³ë·ÂÀº ÇßÁö¸¸, °¡´ÉÇÏ¸é ¿ø¹® ±×´ë·Î¸¦ Âü°íÇϽñ⠹ٶø´Ï´Ù.
  ÀÌ ºÎºÐÀÇ ³»¿ëÀº º¹ÀâÇØ º¸ÀÌÁö¸¸, ¼±¾ðÀ» ºÐ¼®ÇØ µ¥ÀÌÅÍÇüÀ» °áÁ¤ÇÏ´Â ºÎºÐÀÔ´Ï´Ù. ¾Æ·¡¿¡ ³ª¿À´Â ¿¹¸¦ º¸¸é ÀÌÇØ°¡ Á» ´õ ½¬¿ï °Ì´Ï´Ù. ÀÌÇØ°¡ ½±µµ·Ï ¿ø¹®¿¡´Â ¾ø´Â ¼³¸íÀ» ³ª¸§´ë·Î Ãß°¡ÇÏ¿´½À´Ï´Ù.

  ¿¹¸¦ µé¾î, ´ÙÀ½°ú °°Àº ¼±¾ðÀ» »ý°¢Çغ¸¸é,

                int *ap[];

¿©±â¼­ ap[] °¡ D1 ¿¡ ÇØ´çµË´Ï´Ù; ¼±¾ð "int ap[]" (¾Æ·¡ '¹è¿­ ¼±¾ðÀÚ' Âü°í) ´Â ap ¸¦ "array of int (int Çü ¹è¿­)" ·Î ¸¸µé¾î ÁÖ°í, µû¶ó¼­ * µÚ¿¡ ³ª¿À´Â ÇüÇÑÁ¤¾î ¸®½ºÆ® (type-qualifier list) ´Â ¾ø°í, Çüº¯°æÀÚ (type-modifier) ´Â "array of (¡­ÀÇ ¹è¿­, ap[] °¡ D1 À̹ǷÎ)" °¡ µÇ´Â °ÍÀÔ´Ï´Ù. °á±¹ ¸íĪ ap ¿¡ ½ÇÁ¦·Î ¼±¾ðµÇ´Â µ¥ÀÌÅÍÇüÀº "array of pointers to int (int Çü Æ÷ÀÎÅÍÀÇ ¹è¿­)" ÀÌ µÇ´Â °ÍÀÔ´Ï´Ù.
  ´Ù¸¥ ¿¹¸¦ »ìÆìº¸¸é,

                int i, *pi, *const cpi = &i;
                const int ci = 3, *pci;

À§¿¡¼­´Â Á¤¼ö i ¿Í Á¤¼öÇü Æ÷ÀÎÅÍ pi ¸¦ ¼±¾ðÇÕ´Ï´Ù. »ó¼ö Æ÷ÀÎÅÍ cpi ÀÇ °ªÀº º¯ÇÒ ¼ö ¾ø½À´Ï´Ù; Áï cpi ´Â Ç×»ó °°Àº À§Ä¡¸¦ °¡¸£ÄѾ߸¸ Çϸç, cpi °¡ °¡¸£Å°´Â °÷¿¡ ÀúÀåµÇ´Â °ªÀº º¯ÇÒ ¼ö ÀÖ½À´Ï´Ù. Á¤¼öÇü ci ´Â »ó¼öÀ̰í (À§¿¡¼­Ã³·³ ÃʱâÈ­´Â µÇÁö¸¸) °ªÀÌ º¯ÇÒ ¼ö´Â ¾ø½À´Ï´Ù. pci ÀÇ µ¥ÀÌÅÍÇüÀº "pointer to const int (const int Çü Æ÷ÀÎÅÍ)" À̸ç, pci ÀÚü´Â ´Ù¸¥ Àå¼Ò¸¦ °¡¸£Å°µµ·Ï º¯ÇÒ ¼ö ÀÖÁö¸¸, pci ¸¦ ÅëÇØ¼­´Â pci °¡ °¡¸£Å°´Â °÷ÀÇ °ªÀ» ¹Ù²Ü ¼ö ¾ø½À´Ï´Ù.

¢¹ A8.6.2 ¹è¿­ ¼±¾ðÀÚ (Array Declarator)
  ¼±¾ð T D ¿¡¼­,

              D1 [constant-expression opt]

D °¡ À§¿Í °°Àº ÇüŸ¦ °®°í, ¼±¾ð T D1 ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀÌ "type-modifier T (T Çüº¯°æÀÚ)" ¶ó¸é, D ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀº "type-modifier array of T (TÇü ¹è¿­ Çüº¯°æÀÚ)" ÀÔ´Ï´Ù. ¸¸¾à »ó¼ö¼ö½ÄÀÌ ÀÖ´Ù¸é, ±× ¼ö½ÄÀº Á¤¼öÇüÀ̾î¾ß Çϸç, 0 º¸´Ù Ä¿¾ß¸¸ ÇÕ´Ï´Ù. ¹è¿­ÀÇ Å©±â (bound) ¸¦ ³ªÅ¸³»´Â »ó¼ö¼ö½ÄÀÌ »ý·«µÈ´Ù¸é, ¹è¿­Àº ºÒ¿ÏÀüÇÑ Çü (incomplete type) ÀÌ µË´Ï´Ù.
  ¹è¿­Àº »ê¼úÇü, Æ÷ÀÎÅÍ, ±¸Á¶Ã¼, °ø¿ëü, ȤÀº (´ÙÂ÷¿ø ¹è¿­ÀÇ °æ¿ì) ´Ù¸¥ ¹è¿­À» ¿ä¼Ò·Î °®À» ¼ö ÀÖ½À´Ï´Ù. ¹è¿­ÀÇ ¿ä¼Ò´Â ¿ÏÀüÇÑ Çü (complete type) À̾î¾ß¸¸ ÇÕ´Ï´Ù; Áï ºÒ¿ÏÀüÇÑ ÇüÀ» °®´Â ¹è¿­À̳ª ±¸Á¶Ã¼·Î´Â ¹è¿­À» ±¸¼ºÇÒ ¼ö ¾ø½À´Ï´Ù. ÀÌ´Â °ð ´ÙÂ÷¿ø ¹è¿­¿¡¼­ ¿ÀÁ÷ ù¹øÂ° ÷ÀÚ¸¸À» »ý·«ÇÒ ¼ö ÀÖÀ½À» ÀǹÌÇÕ´Ï´Ù. ºÒ¿ÏÀüÇÑ ÇüÀÇ ¹è¿­Àº ¿ÏÀüÇÑ ´Ù¸¥ ¼±¾ðÀÌ ³ª¿Àµç°¡ (A10.2) ¾Æ´Ï¸é ÃʱâÈ­ µÊÀ¸·Î½á (A8.7) ¿ÏÀüÇÑ Çü (complete type) ÀÌ µË´Ï´Ù. ¹è¿­ÀÇ ¿¹¸¦ µé¸é,

                float fa[17], *afp[17];

À§¿Í °°Àº ¼±¾ðÀº float Çü ¼ýÀÚµéÀÇ ¹è¿­°ú, float Çü Æ÷ÀÎÅÍÀÇ ¹è¿­ (array of pointer to float) À» ÀǹÌÇÕ´Ï´Ù. ¶ÇÇÑ,

                static int x3d[3][5][7];

°ú °°Àº ¼±¾ðÀº 3x5x7 Çà·Ä ÇüÅÂÀÇ Á¤Àû 3Â÷¿ø ¹è¿­À» ÀǹÌÇÕ´Ï´Ù. ÀÚ¼¼ÇÏ°Ô ¼³¸íÇϸé, x3d ´Â 3°³ÀÇ ¿ä¼Ò¸¦ °¡Áö°í ÀÖ½À´Ï´Ù; °¢°¢ÀÇ ¿ä¼Ò´Â °¢°¢ 5°³ÀÇ ¹è¿­¸¦ °®°í ÀÖ´Â ¹è¿­ÀÔ´Ï´Ù; ¶Ç 5°³ÀÇ ¹è¿­Àº °¢°¢ 7°³ÀÇ Á¤¼ö¸¦ °®´Â ¹è¿­ÀÔ´Ï´Ù. x3d, x3d[i], x3d[i][j], x3d[i][j][k] Áß ¾î¶°ÇÑ Ç¥Çöµµ ¼ö½Ä¿¡ ³ª¿Ã ¼ö ÀÖ½À´Ï´Ù. óÀ½ 3°³ÀÇ µ¥ÀÌÅÍÇüÀº "¹è¿­"À̰í, ¸¶Áö¸· Çϳª¸¸ int ÇüÀÔ´Ï´Ù. ´õ »ó¼¼È÷ ¼³¸íÇϸé, x3d[i][j] ´Â 7°³ÀÇ Á¤¼ö¸¦ °®´Â ¹è¿­À̰í, x3d[i] ´Â 7°³ÀÇ Á¤¼ö¸¦ °®´Â 5°³ÀÇ ¹è¿­ÀÇ ¹è¿­ÀÔ´Ï´Ù.
  ¹è¿­ÀÇ Ã·ÀÚ¿¬»ê (subscripting operation) E1[E2] ´Â *(E1+E2) ¿Í µ¿ÀÏÇÏ´Ù°í Á¤ÀǵǾî ÀÖ½À´Ï´Ù. µû¶ó¼­ ¸ð¾çÀÌ ÀÌ»óÇÏÁö¸¸, ÷ÀÚ¿¬»êÀº ±³È¯¹ýÄ¢ÀÌ ¼º¸³ÇÏ´Â ¿¬»êÀÔ´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  µû¶ó¼­ a °¡ ¹è¿­À̰í, i °¡ Á¤¼ö°ªÀ̶ó°í ÇÒ¶§, a[i] »Ó¸¸ ¾Æ´Ï¶ó i[a] ¿Í °°Àº ÇüÅÂÀÇ ¹è¿­ »ç¿ëµµ °¡´ÉÇÕ´Ï´Ù. a[i] ¿Í i[a] ´Â °¢°¢ *(a+i) ¿Í *(i+a) ·Î °á±¹ µ¿ÀÏÇÑ °á°ú¸¦ °¡Á®¿É´Ï´Ù.

+ ¿¬»êÀÚ¿Í ¹è¿­¿¡ Àû¿ëµÇ´Â º¯È¯±ÔÄ¢ (A6.6, A7.1, A7.7) ¶§¹®¿¡, E1 ÀÌ ¹è¿­À̰í E2 °¡ Á¤¼öÇüÀ̶ó¸é, E1[E2] ´Â E1 ÀÇ E2 ¹øÂ° ¿ä¼Ò¸¦ ÂüÁ¶ÇÕ´Ï´Ù.
  ¿¹¸¦ µé¸é, x3d[i][j][k] ´Â *(x3d[i][j] + k) ¿Í µ¿ÀÏÇÕ´Ï´Ù. ù¹øÂ° ºÎ¼ö½ÄÀÎ x3d[i][j] ´Â A7.1 ¿¡¼­ ¼³¸íÇÑ ±ÔÄ¢¿¡ ÀÇÇØ "Á¤¼öÇü ¹è¿­À» °¡¸£Å°´Â Æ÷ÀÎÅÍ"·Î º¯È¯µË´Ï´Ù; A7.7 Àý¿¡¼­ ¼³¸íÇßµíÀÌ, µ¡¼À(+)Àº ¹è¿­À» ±¸¼ºÇÏ´Â Á¤¼öÇüÀÇ Å©±â¿¡ °öÇÑ °ªÀ» ´õÇÏ°Ô µË´Ï´Ù. ¹è¿­Àº Çà (row) ´ÜÀ§·Î ÀúÀåµÇ¸ç (µû¶ó¼­ ¸¶Áö¸· ÷ÀÚ°¡ °¡Àå »¡¸® º¯ÇÕ´Ï´Ù), ¼±¾ð¿¡¼­ÀÇ Ã¹¹øÂ° ÷ÀÚ´Â ±× ¹è¿­¿¡ ÀÇÇØ ¼ÒºñµÇ´Â ±â¾ïÀå¼ÒÀÇ ¾çÀ» °áÁ¤Çϴµ¥ µµ¿òÀ» ÁÙ »Ó, ÷ÀÚ°è»ê¿¡ Âü¿©ÇÏÁö´Â ¾Ê½À´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ¹è¿­ÀÇ Ã¹¹øÂ° ÷ÀÚ´Â ¼ö½ÄÀÇ °ªÀ» °áÁ¤Çϴµ¥ ÇÊ¿äÇÏÁö ¾Ê½À´Ï´Ù. ÀÌ´Â ¹è¿­¿¬»êÀÇ Á¤Àǰ¡ Æ÷ÀÎÅÍ ¿¬»êÀε¥¼­ ¿¬À¯ÇÕ´Ï´Ù. ¿¹¸¦ µé¸é, 1Â÷¿ø ¹è¿­¿¡¼­, ¾î¶°ÇÑ ¿ä¼Ò¿¡ ÀúÀåµÈ °ªÀ» ¾Ë±â À§Çؼ­ ¹è¿­ÀÇ Å©±â°¡ ¾ó¸¶ÀÎÁö (¡æ ù¹øÂ° ÷ÀÚÀÇ ÀǹÌ) ¾Ë Çʿ䰡 ¾ø½À´Ï´Ù. ÀÌ´Â ´ÙÂ÷¿ø ¹è¿­¿¡¼­µµ ¸¶Âù°¡ÁöÀÔ´Ï´Ù. ´ÙÂ÷¿ø ¹è¿­¿¡¼­µµ, ¾î¶°ÇÑ ¿ä¼ÒÀÇ °ªÀ» ¾Æ´Âµ¥´Â ù¹øÂ° ÷ÀÚ¸¦ Á¦¿ÜÇÑ ³ª¸ÓÁö ÷ÀÚ¸¸ ÀÖÀ¸¸é µË´Ï´Ù.

¢¹ A8.6.3 ÇÔ¼ö ¼±¾ðÀÚ (Function Declarator)
  Çö´ëÀû ¹æ½Ä (new-style) ÀÇ ÇÔ¼ö¼±¾ð T D ¿¡¼­,

              D1 (parameter-type-list)

D °¡ À§¿Í °°Àº ÇüŸ¦ °®°í, ¼±¾ð T D1 ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀÌ "type-modifier T (T Çüº¯°æÀÚ)" ¶ó¸é, D ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀº "type-modifier function with arguments parameter-type-list returning T (¸Å°³º¯¼ö-µ¥ÀÌÅÍÇü-¸®½ºÆ®¸¦ ÀÎÀÚ·Î °®°í TÇüÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö Çüº¯°æÀÚ)" ÀÔ´Ï´Ù.
  ¸Å°³º¯¼ö (parameter) ÀÇ ¹®¹ýÀº ¾Æ·¡¿Í °°½À´Ï´Ù.

parameter-type-list:
        parameter-list
        parameter-list , ...

parameter-list:
        parameter-declaration
        parameter-list , parameter-declaration

parameter-declaration:
        declaration-specifiers   declarator
        declaration-specifiers   abstract-declarator opt

Çö´ëÀû ¹æ½ÄÀÇ ¼±¾ð¿¡¼­, ¸Å°³º¯¼ö ¸®½ºÆ® (parameter list) ´Â ¸Å°³º¯¼öÀÇ µ¥ÀÌÅÍÇüÀ» ¾Ë·ÁÁÝ´Ï´Ù. Çö´ëÀû ¹æ½ÄÀÇ ÇÔ¼ö ¼±¾ðÀÚ°¡ ¸Å°³º¯¼ö¸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù¸é, ¸Å°³º¯¼ö µ¥ÀÌÅÍÇü ¸®½ºÆ® (prarmeter type list) ¿¡´Â void ¶ó´Â Ű¿öµå¸¸ ³ª¿É´Ï´Ù. ¸¸¾à ¸Å°³º¯¼ö µ¥ÀÌÅÍÇü ¸®½ºÆ®°¡ »ý·«ºÎÈ£ ", ..." ·Î ³¡³­´Ù¸é, ±× ÇÔ¼ö´Â ÁÖ¾îÁø ¸Å°³º¯¼öÀÇ °³¼öº¸´Ù ´õ ¸¹Àº ÀÎÀÚ¸¦ ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù. (A7.3.2 Âü°í)
  ¸Å°³º¯¼öÀÇ µ¥ÀÌÅÍÇüÀÌ ÇÔ¼ö³ª ¹è¿­À̶ó¸é, A10.1 Àý¿¡¼­ ¼³¸íÇÒ ¸Å°³º¯¼ö º¯È¯ (parameter conversion) ±ÔÄ¢¿¡ ÀÇÇØ Æ÷ÀÎÅÍ·Î º¯È¯µË´Ï´Ù. ¸Å°³º¯¼öÀÇ ¼±¾ð ÁöÁ¤ÀÚ (declaration specifier) ¿¡ Çã¶ôµÇ´Â ±â¾ïºÎ·ù ÁöÁ¤ÀÚ´Â register »ÓÀ̸ç, ÀÌ·¯ÇÑ ÁöÁ¤ÀÚ´Â ¼±¾ðÀÚ°¡ ÇÔ¼öÁ¤ÀÇ (function definition) ºÎºÐ¿¡ ³ª¿ÀÁö ¾Ê´Â ÀÌ»óÀº ¹«½ÃµË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ÇÔ¼öÀÇ Á¤ÀǺκп¡¼­ ¸Å°³º¯¼ö¿¡ register ÁöÁ¤ÀÚ¸¦ ÁÖÁö¾Ê´Â ÀÌ»ó, ¾Æ¹«¸® ÇÔ¼ö ¼±¾ð¿¡ register ÁöÁ¤ÀÚ¸¦ Áشٰí ÇØµµ ±× ÁöÁ¤ÀÚ´Â ¹«½ÃµÈ´Ù´Â ÀǹÌÀÔ´Ï´Ù.

À¯»çÇϰÔ, ¸Å°³º¯¼ö ¼±¾ð¿¡ ÀÖ´Â ¼±¾ðÀÚ°¡ ¸íĪÀ» Æ÷ÇÔÇϰí ÀÖ°í, ÇÔ¼ö ¼±¾ðÀÚ°¡ ÇÔ¼öÁ¤ÀÇ ºÎºÐ¿¡ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó¸é, ±× ¸íĪÀº Áï½Ã Åë¿ë¹üÀ§ (scope) ¸¦ ºüÁ®³ª°¡°Ô µË´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  Áï, ÇÔ¼öÁ¤Àǰ¡ ¾Æ´Ñ ÇÔ¼ö¼±¾ð¿¡ ³ª¿À´Â ¸íĪÀÇ Åë¿ë¹üÀ§´Â ¸Å°³º¯¼ö¸¦ µÑ·¯½Î°í ÀÖ´Â °ýÈ£¿¡¼­ ³¡³­´Ù´Â ÀǹÌÀÔ´Ï´Ù. ¾Æ·¡¿Í °°ÀÌ, ÇÔ¼ö ¼±¾ð¿¡¼­ a ¶ó´Â ¸íĪÀ» »ç¿ëÇß´Ù°í ÇØµµ, ÀÌ ¸íĪÀÌ ÇÔ¼öÁ¤ÀÇ¿¡¼­ »ç¿ëµÈ °ÍÀÌ ¾Æ´Ï¹Ç·Î ¸Å°³º¯¼ö ¸®½ºÆ®¸¦ ´Ý´Â °ýÈ£¿¡¼­ ±× Åë¿ë¹üÀ§°¡ ³¡³ª´Â °ÍÀÔ´Ï´Ù.

                int func(int a);
                double a;

ÇÔ¼ö func ÀÇ ¼±¾ð¿¡¼­ »ç¿ëµÈ a ¶ó´Â ¸íĪÀÇ Åë¿ë¹üÀ§´Â ´Ý´Â °ýÈ£ ) ¿¡¼­ ³¡³ª±â ¶§¹®¿¡, ¾Æ·¡¿¡ ÀÖ´Â double Çü a ¿¡°Ô ¿µÇâÀ» ÁÖÁö ¾Ê½À´Ï´Ù.

                int func(int a, int a); /* ºÒ°¡´É */

´Ü À§¿¡¼­ º¸´Â °Íó·³, ¼±¾ð¿¡¼­ÀÇ Áߺ¹µÈ ¸íĪ »ç¿ëÀº ºÐ¸í a ÀÇ Åë¿ë¹üÀ§°¡ ³¡³ªÁö ¾ÊÀº »óÅ¿¡¼­ ³ª¿Â °ÍÀ̹ǷΠºÒ°¡´ÉÇÕ´Ï´Ù.
  ¹Ý¸é¿¡, ÇÔ¼öÁ¤ÀÇ¿¡¼­ »ç¿ëµÈ ¸Å°³º¯¼öÀÇ ¸íĪÀº ÇÔ¼ö º»Ã¼ (body) ÀÇ °¡Àå À­ºÎºÐ¿¡¼­ ¼±¾ðµÈ °ÍÀ¸·Î º¸±â ¶§¹®¿¡ ÇÔ¼ö Àüü¿¡ °ÉÃÄ Åë¿ë¹üÀ§°¡ Àû¿ëµË´Ï´Ù.
  ÇÔ¼ö¼±¾ð°ú Á¤ÀÇ¿¡ »ç¿ëµÈ ¸íĪ¿¡ ´ëÇÑ º¸´Ù ÀÚ¼¼ÇÑ »çÇ×Àº ³ªÁß¿¡ ¶Ç ´Ù·ç°Ô µË´Ï´Ù.

¸íĪÀÌ ³ª¿ÀÁö ¾Ê´Â Ãß»óÀû (abstract) ¼±¾ðÀÚ´Â A8.8 Àý¿¡¼­ ¼³¸íÇÕ´Ï´Ù.
  °íÀüÀûÀÎ ¹æ½Ä (old-style) ÀÇ ÇÔ¼ö¼±¾ð T D ¿¡¼­,

              D1 (identifier-list opt)

D °¡ À§¿Í °°Àº ÇüŸ¦ °®°í, ¼±¾ð T D1 ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀÌ "type-modifier T (T Çüº¯°æÀÚ)" ¶ó¸é, D ¿¡ ÀÖ´Â ¸íĪÀÇ µ¥ÀÌÅÍÇüÀº "type-modifier function of unspecified arguments returning T (ÀÎÀÚÀÇ Á¤º¸°¡ ÁÖ¾îÁöÁö ¾Ê°í, TÇüÀ» ¹ÝȯÇÏ´Â ÇÔ¼ö Çüº¯°æÀÚ)" ÀÔ´Ï´Ù. ¸Å°³º¯¼ö°¡ ÀÖ´Ù¸é ´ÙÀ½°ú °°Àº Çü½ÄÀ» °®½À´Ï´Ù.

identifier-list:
        identifier-list
        identifier-list , identifier

°íÀüÀû ¹æ½ÄÀÇ ¼±¾ðÀÚ¿¡¼­, ±× ¼±¾ðÀÚ°¡ ÇÔ¼öÁ¤ÀÇ (A10.1) ºÎºÐ¿¡ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó¸é ¸íĪ ¸®½ºÆ® (identifier list) ´Â ¾ø¾î¾ß¸¸ ÇÕ´Ï´Ù. ¸Å°³º¯¼öÀÇ µ¥ÀÌÅÍÇü¿¡ ´ëÇÑ ¾î¶°ÇÑ Á¤º¸µµ ¼±¾ð¿¡ ÀÇÇØ ÁÖ¾îÁöÁö ¾Ê½À´Ï´Ù.
  ¿¹¸¦ µé¾î,

            int f(), *fpi(), (*pfi)();

À§¿Í °°Àº ¼±¾ðÀº Á¤¼ö¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö f, Á¤¼öÇü Æ÷ÀÎÅ͸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö fpi, Á¤¼ö¸¦ ¹ÝȯÇÏ´Â ÇÔ¼ö¸¦ °¡¸£Å°´Â Æ÷ÀÎÅÍ pfi ¸¦ ÀǹÌÇÕ´Ï´Ù. À§ÀÇ ¼±¾ð¿¡´Â ¸Å°³º¯¼öÀÇ µ¥ÀÌÅÍÇü¿¡ ´ëÇÑ »çÇ×ÀÌ ÀüÇô ¾ø½À´Ï´Ù; Áï À§ÀÇ ¼±¾ðÀº °íÀüÀû ¹æ½ÄÀÔ´Ï´Ù.
  ´ÙÀ½°ú °°Àº Çö´ëÀû ¹æ½ÄÀÇ ¼±¾ð¿¡¼­´Â,

            int strcpy(char *dest, const char *source), rand(void);

strcpy ´Â ¹®ÀÚÇü Æ÷ÀÎÅÍ¿Í ¹®ÀÚ »ó¼öÇü Æ÷ÀÎÅÍ (pointer to constant character) ¸¦ ÀÎÀÚ·Î °®°í, int ÇüÀ» ¹ÝȯÇÏ´Â ÇÔ¼öÀÔ´Ï´Ù. ÇÔ¼ö¼±¾ð¿¡¼­ ¸Å°³º¯¼öÀÇ À̸§Àº ½ÇÁ¦·Î´Â ÁÖ¼®¿¡ ºÒ°úÇÕ´Ï´Ù. µÎ¹øÂ° ÇÔ¼ö rand ´Â ÀÎÀÚ°¡ ¾øÀ¸¸ç, int ÇüÀ» ¹ÝȯÇÕ´Ï´Ù.

¢º ¿ªÀÚ ÁÖ
  ¼±¾ð¿¡¼­ ¸Å°³º¯¼öÀÇ ¸íĪÀÌ ÁÖ¼®¿¡ ºÒ°úÇÏ´Ù´Â ¸»Àº, ÄÄÆÄÀÏ·¯°¡ ÇÔ¼öÁ¤ÀÇ ºÎºÐÀÇ ¸íΰú ¼±¾ðÀÇ ¸íĪÀÌ µ¿ÀÏÇѰ¡ °Ë»çÇÏÁö ¾Ê´Â´Ù´Â ¶æÀÔ´Ï´Ù. (µ¥ÀÌÅÍÇü¸¸À» °Ë»çÇÕ´Ï´Ù) Áï À§¿¡¼­ À̾߱âÇÑ °Íó·³ Áߺ¹µÇ´Â ¸íΏ¸ »ç¿ëÇÏÁö ¾ÊÀ¸¸é ±»ÀÌ ÇÔ¼öÁ¤ÀÇ ºÎºÐÀÇ ¸íĪÀ» ±×´ë·Î ½áÁÙ Çʿ䵵 ¾ø´Ù´Â ÀǹÌÀÔ´Ï´Ù. µû¶ó¼­ ´ÙÀ½°ú °°Àº °ÍÀÌ °¡´ÉÇÕ´Ï´Ù.

int func(int a, float b)       /* ÇÔ¼öÁ¤ÀÇ */
{
    ... ÇÔ¼ö º»Ã¼ ...
}

/* ¾Æ·¡ÀÇ ¼±¾ðÀº ¸ðµÎ Àû¹ý */
int func(int a, float b);
int func(int x, float y);
int func(int b, float a);
int func(int y, float m);
int func(int, float);
...

  ¸Å°³º¯¼öÀÇ ¿øÇü (prototype) À» °®´Â ÇÔ¼ö ¼±¾ðÀÚ´Â ANSI Ç¥ÁØ¿¡ ÀÇÇÑ º¯È­Áß °¡Àå Áß¿äÇÑ °ÍÀÔ´Ï´Ù. ¹°·Ð µÎ ¹æ½ÄÀ» ¸ðµÎ ¼ö¿ëÇØ¾ß¸¸ ÇÏ´Â Çʿ伺°ú ¼Ò°³Çϴµ¥ µû¸£´Â ¾î·Á¿òÀÌ ÀÖ±â´Â ÇÏÁö¸¸, Çö´ëÀû ¹æ½ÄÀÇ ¼±¾ðÀº ÃÊÆÇ¿¡¼­ ¼³¸íÇß´ø °íÀüÀû ¹æ½Ä°ú ºñ±³ÇØ, ÇÔ¼öÈ£Ãâ¿¡ Àü´ÞÇÏ´Â ÀÎÀÚÀÇ °­Á¦º¯È¯°ú ¿¡·¯°Ë»ç °°Àº ÀÌÁ¡À» Á¦°øÇÕ´Ï´Ù. µÎ ¹æ½ÄÀÇ È£È¯¼ºÀ» À§ÇØ, ¸Å°³º¯¼ö°¡ ¾ø´Â Çö´ëÀû ¹æ½ÄÀÇ ÇÔ¼ö¼±¾ð¿¡´Â void ¶ó´Â ¸í¹éÇÑ Ç¥½Ã°¡ ÇÊ¿äÇÏ´Ù´Â º¸±â½ÈÀº ¹®¹ýÀÌ ÇÊ¿äÇØ Áý´Ï´Ù.
  °¡º¯ÀÎÀÚ ÇÔ¼ö (variadic function) ¸¦ À§ÇÑ »ý·«ºÎÈ£ ", ..." ´Â Ç¥ÁØÇì´õ <stdarg.h> ¿¡ ÀÖ´Â ¸ÅÅ©·Î¿Í ÇÔ²² »õ·Î¿î °ÍÀ̸ç, ±×µ¿¾È °ø½ÄÀûÀ¸·Î´Â ±ÝÁöµÇ¾î ºñ°ø½ÄÀûÀ¸·Î »ç¿ëµÇ´ø °¡º¯ÀÎÀÚ ±â¼úÀ» Á¤½ÄÀ¸·Î ¹Þ¾ÆµéÀÌ´Â °ÍÀÔ´Ï´Ù.
  ÀÌ·¯ÇÑ Ç¥±â¹ýµéÀº C++ ·ÎºÎÅÍ ¹ÞÀº °ÍÀÔ´Ï´Ù.


ÀÌÀü [¡ã ¸ÇÀ§·Î]
[¢Ê ¸ñÂ÷·Î]
´ÙÀ½