1586, 1/80 ȸ¿ø°¡ÀÔ  ·Î±×ÀΠ 
   wolverine
   [ÀÚÀÛ] C °­ÁÂ [6] - Pointer & Array

http://www.hackerschool.org/HS_Boards/zboard.php?id=Free_Lectures&no=2039 [º¹»ç]


Áö³­ Àå¿¡¼­´Â Pointer¿¡ ´ëÇؼ­ ¹è¿ü½À´Ï´Ù.
À̹ø Àå¿¡¼­´Â PointerÀÇ È°¿ë¿¡ ´ëÇؼ­ °è¼Ó À̾°¡°Ú½À´Ï´Ù.

Áö³­ Àå ¸¶Áö¸·¿¡ À̾߱â ÇßµíÀÌ,
¿Ö º¹ÀâÇÏ°Ô º¯¼ö¸¦ ¼±¾ðÇÏ°í,
¼±¾ðµÈ º¯¼öÀÇ ÁÖ¼Ò¸¦,
¶Ç ´Ù½Ã ¼±¾ðµÈ Pointer º¯¼ö¿¡ Áý¾î ³Ö´ÂÁö...
¿¡ ´ëÇÑ È®½ÇÇÑ ´äÀ» °¡Áö°í ÀÖ¾î¾ß ÇÕ´Ï´Ù.

À̹ø Àå¿¡¼­´Â ±× ÀÌÀ¯ Áß ÇÑ°¡ÁöÀÎ array(¹è¿­)°ú ¿¬°üÁö¾î¼­
À̾߱⸦ Ç®¾î³ª°¡µµ·Ï ÇÏ°Ú½À´Ï´Ù.

[Array]
¹è¿­Àº º¯¼ö À̸§°ú index¸¦ ÅëÇؼ­ access °¡´ÉÇÑ ÇüÅÂÀÇ º¯¼öÀ̸ç,
data base ó¸® ¹× sw¸¦ ÀÌ¿ëÇÑ ½Åȣ󸮿¡¼­ ƯÈ÷³ª ¸¹ÀÌ ÀÌ¿ëµË´Ï´Ù.

Array(¹è¿­)Àº ´ÙÀ½°ú °°ÀÌ ¼±¾ðÀÌ µË´Ï´Ù.

int a[100];
int b[100];
int c[100];

¼±¾ðµÈ int ¹è¿­Àº ´ÙÀ½°ú °°ÀÌ [] ¾È¿¡ ÀÖ´Â index¸¦ ±âÁØÀ¸·Î accessµË´Ï´Ù.
´Ü, À̶§¿¡ index´Â zero-base, Áï 0ºÎÅÍ ½ÃÀÛ ÇÕ´Ï´Ù.

for(n=0; n<100; n++) a[n] = n;

À§ÀÇ ¿¹Á¦¿¡¼­ ¹è¿­ a´Â memory »ó¿¡¼­ ´ÙÀ½°ú °°ÀÌ ÀÚ¸®¸¦ Àâ°Ô µË´Ï´Ù.
(base address´Â compiler/linker°¡ ¾Ë¾Æ¼­ Àâ¾ÆÁÝ´Ï´Ù.)

     --------------------------------------
a[0] |                 0                  |   base address
     --------------------------------------
a[1] |                 1                  |   base address + 4
     --------------------------------------
a[2] |                 2                  |   base address + 8
     --------------------------------------
a[3] |                 3                  |   base address + 12
     --------------------------------------
a[4] |                 4                  |   base address + 16
     --------------------------------------
                     ....

     --------------------------------------
a[99]|                 99               |   base address + 99x4
     --------------------------------------

¾Æ·¡ ¿¹Á¦¿¡¼­, a[0]´Â 0À» ¹ÝȯÇÏ°í, &a[0]´Â base address¸¦ ¹ÝȯÇÏ°í,
±× ´ÙÀ½µµ ¼øÂ÷ÀûÀ¸·Î Áõ°¡ÇÏ´Â °ÍÀ» È®ÀÎ ÇÒ ¼ö ÀÖ½À´Ï´Ù.

for(n=0; n<100; n++) printf("%x: %d", &a[n], a[n]);

¹è¿­Àº ÀÌ¿Í °°ÀÌ µ¿ÀÏÇÑ ÇüÅÂÀÇ data setÀ» ÇϳªÀÇ ´ëÇ¥ À̸§°ú index·Î
󸮰¡ °¡´ÉÇÏ°Ô ÇØÁÝ´Ï´Ù.

ÀÌ·¯ÇÑ ¹è¿­À» function ³»¿¡¼­ ó¸®Çϱâ À§Çؼ­
ÀÎÀÚ¸¦ ³Ñ°Ü ÁÙ¶§¿¡ pointer°¡ »ç¿ëµË´Ï´Ù.

¿¹¸¦ µé¾î¼­,
¹è¿­ a¿Í ¹è¿­ b¸¦ ¼øÂ÷ÀûÀ¸·Î °¢°¢ ´õÇؼ­ ¹è¿­ c¿¡ °á°ú¸¦ ÀúÀåÇÏ´Â ÇÔ¼ö¸¦
±¸ÇöÇØ¾ß ÇÑ´Ù°í ÇßÀ»¶§¿¡,
ÇÔ¼ö´Â ¾Æ·¡¿Í °°ÀÌ ¹è¿­ a,b,cÀÇ base address¸¦ ÀÎÀÚ·Î ¹ÞÀ» ¼ö ÀÖ½À´Ï´Ù.

void func1(int *a1, int *a2, int *sum, int nMax)
{
    int n;
    
    for(n=0; n<nMax; n++)
        sum[n] = a1[n] + a2[n];
    
    return;
}

ÇÔ¼ö func1¿¡ ¹è¿­µéÀÇ base address¸¦ ´ÙÀ½°ú °°ÀÌ ³Ñ°ÜÁÖ¸é,
func1Àº ½ÇÁúÀûÀ¸·Î a ¿Í b¸¦ °¢°¢ ´õÇؼ­ c¿¡ °ªÀ» ÀúÀåÇÏ°Ô µË´Ï´Ù.

func1(&a[0], &b[0], &c[0], 100);

¶ÇÇÑ &a[0]¿Í a´Â °°Àº ÀÇ¹Ì À̱⠶§¹®¿¡ ´ÙÀ½°ú °°ÀÌ È£ÃâµÉ ¼öµµ ÀÖ½À´Ï´Ù.

func1(a, b, c, 100);

µÎ °¡Áö ÇÔ¼ö È£Ãâ ¸ðµÎ µ¿ÀÏÇÑ °á°ú¸¦ ³ªÅ¸³À´Ï´Ù.

ÀÌó·³, Array variableÀ» ÇÔ¼ö ³»¿¡¼­ ó¸®ÇÏ°íÀÚ ÇÒ ¶§¿¡´Â,
±× ÇÔ¼ö¿¡ ¹è¿­ÀÇ base address¸¦ ÀÎÀÚ·Î Àü´ÞÇϸç ó¸®ÇÏ°í,
À̶§¿¡ À§¿Í °°ÀÌ pointer º¯¼ö°¡ ÀÌ¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.

¿©±â¼­ ÇÑ°¡Áö ´õ ¸»¾¸À» µå¸®¸é,
func1¿¡¼­ int *a1, int *a2, int *sum ¶ó°í ¼±¾ðÇÏ°í,
a1[n], a2[n], sum[n]°ú °°ÀÌ ¹è¿­·Î ÀÌ¿ëÀ» ÇÏ¿´½À´Ï´Ù.
ÀÌ·¸°Ô Æ÷ÀÎÅÍ º¯¼öµµ ¹è¿­°ú ¸¶Âù°¡Áö·Î [index] ¸¦ ºÙ¿©¼­ ÀÌ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

¸¸¾à¿¡,

int *x;

¶ó°í ¼±¾ðÀ» ÇÏ°í,

for(n=0; n<100; n++) x[n] = n;

À̶ó°í codingÀ» Çϸé,
compiler´Â pointer x °¡ ÃʱâÈ­ µÇÁö ¾Ê¾Ò´Ù°í warningÀ» ¶ç¿ó´Ï´Ù.
ÇÏÁö¸¸, warningÀ» ¹«½ÃÇÏ¸é ¾î·µç compile/link°¡ µÇ¾î¼­ ½ÇÇà ÆÄÀÏÀÌ ¸¸µé¾î Áý´Ï´Ù.

±×¸®°í, À§ÀÇ code¸¦ ½ÇÇà ½ÃÅ°¸é,
¿îÀÌ ÁÁÀ¸¸é µ¹¾Æ°¥ ¼öµµ ÀÖ°í,
¿îÀÌ ¾øÀ¸¸é ÇÁ·Î±×·¥ÀÌ ¿Àµ¿ÀÛ ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

x´Â ´ÙÀ½°ú °°ÀÌ memory »ó¿¡ ÇÒ´çÀÌ µÇ°í,
x´Â ÃʱâÈ­ µÇ¾î ÀÖÁö ¾Ê±â ¶§¹®¿¡,
±× ¾È¿¡ ÀÖ´Â °ªÀº unknown ÀÔ´Ï´Ù.

     --------------------------------------
x   |              unknown               |   0xXXXXXXXX(º¯¼ö xÀÇ address)
     --------------------------------------

¿¹¸¦ µé¾î¼­ ÃʱâÈ­ µÇÁö ¾ÊÀº x¿¡ 0ÀÌ µé¾î ÀÖÀ» °æ¿ì,
x[n]Àº 0À» base address·Î Çؼ­
0,4,8,12...¸Þ¸ð¸® ¹øÁö¿¡
0,1,2,3...ÀÇ °ªÀ»
Â÷·Ê·Î write ÇÏ°Ô µË´Ï´Ù.

¸¸¾à¿¡ 0 ~ 99x4 ¹øÁöÀÇ ¸Þ¸ð¸®¿¡
ÇöÀç ÇÁ·Î±×·¥ÀÇ ¼öÇà°ú °ü·ÃÀÌ ÀÖ´Â code³ª data°¡ ÀÖ´Ù¸é,
ÇÁ·Î±×·¥ÀÌ ¿Àµ¿ÀÛ ¶Ç´Â ¿À·ù¸¦ ¶ç¿ì¸ç Á¾·á ÇÒ °ÍÀÌ°í,
±×·¸Áö ¾Ê´Ù¸é, ¿î ÁÁ°Ô ½ÇÇà µÉ ¼öµµ ÀÖ½À´Ï´Ù.

¸¸¾à À§ÀÇ ¿¹Á¦¿¡¼­

int *x;
x = a; (¶Ç´Â x = &a[0];)

¶ó°í x¸¦ ÃʱâÈ­ÇÑ ÈÄ¿¡ for-loopÀÌ ¼öÇàµÇ¸é,
½ÇÁúÀûÀ¸·Î ¹è¿­ a¿¡ n °ªÀÌ ¼øÂ÷ÀûÀ¸·Î ÀúÀåµÇ°Ô µË´Ï´Ù.

¶ÇÇÑ func1À» È£ÃâÇÒ ¶§¿¡, 100´ë½Å¿¡ 200À» ³Ö°Ô µÇ¾îµµ ¸¶Âù°¡Áö ÀÔ´Ï´Ù.
¾Æ·¡¿Í °°Àº °æ¿ì´Â compile½Ã¿¡ warngingÀÌ º¸°íµÇÁöµµ ¾Ê½À´Ï´Ù.

func1(&a[0], &b[0], &c[0], 200);

À§ÀÇ È£ÃâÀº Build(Compile/Link)´Â µÇÁö¸¸,
½ÇÁ¦ µ¿ÀÛÀº º¸ÀåÇÒ ¼ö ¾ø°í,
´ëºÎºÐ run-time error³ª °è»êÀÇ ¿À·ù¸¦ º¸ÀÌ°Ô µÇÁö¸¸,
¾ÆÁÖ ¾ÆÁÖ ¿îÀÌ ÁÁ°Ôµµ,
a[99], b[99], c[99] ÀÇ ¸Þ¸ð¸® ¹øÁö ÀÌÈÄ¿¡
¾Æ¹«·± º¯¼ö°¡ ÇÒ´çÀÌ ¾ÈµÇ¾î ÀÖ´Ù¸é,
¿øÇÏ´Â ´ë·Î µ¹¾Æ°¡°Ô µË´Ï´Ù.

Compiler´Â ÃʱâÈ­ µÇÁö ¾Ê´Â pointer º¯¼ö¿¡ ´ëÇؼ­ warningÀ» report ÇÏÁö¸¸,
À§¿Í °°Àº °æ¿ì´Â warning Á¶Â÷ ³ª¿ÀÁö ¾Ê°í build°¡ µË´Ï´Ù.

À§ÀÇ ¿¹Á¦¿¡¼­ ó·³ pointer¿Í array´Â Ç×»ó Á¶½ÉÇؼ­ ´Ù·ç¾î¾ß ÇÕ´Ï´Ù.

À̹ø ÀåÀº pointer ¿Í array¸¦ ¾Ë¾ÆºÃ½À´Ï´Ù.

°­Á¶ÇÏÁö¸¸,
À§ÀÇ ¹®¹ýÀ̳ª º¯ÇüµÈ »ç¿ë¹ýÀº Ã¥À̳ª google ¿¡¼­ ½±°Ô ãÀ» ¼ö ÀÖ½À´Ï´Ù.
¾²´Ùº¸¸é ÀÚ¿¬½º·´°Ô ¿Ü¿öÁö°í,
¸ð¸£´õ¶óµµ ¹®¹ýÀ̳ª ´Ù¸¥ »ç¿ë¹ýÀº ½±°Ô ãÀ» ¼ö ÀÖ½À´Ï´Ù.

¿Ö pointer¸¦ »ç¿ëÇØ¾ß ÇÏ´ÂÁö.
ÀÌ·¸°Ô codingÀ» ÇÏ¸é ¸Þ¸ð¸®¿¡¼­ ¾î¶² access°¡ ÀϾ´ÂÁö
Å« ±×¸²À» ±×¸± ¼ö ÀÖ¾î¾ß ÇÕ´Ï´Ù.

ÀÌ»óÀ¸·Î À̹ø ÀåÀ» ¸¶Ä¡°Ú½À´Ï´Ù.

Best Regards,
Wolverine


  Hit : 6131     Date : 2012/07/12 05:54



    
     [°øÁö] °­Á¸¦ ¿Ã¸®½Ç ¶§´Â ¸»¸Ó¸®¸¦ ´Þ¾ÆÁÖ¼¼¿ä^¤Ñ^ [29] ¸Û¸Û 02/27 18906
1585   ÆÄÀ̽ã random¸ðµâÀ» ÀÌ¿ëÇÑ ¼ýÀÚ¸ÂÃ߱⠰ÔÀÓ ±¸Çö     ÇØÅ·ÀßÇÏ°í½Í´Ù
05/30 181
1584   ÆÄÀ̽ã äÆà ÇÁ·Î±×·¥ ±¸Çö     ÇØÅ·ÀßÇÏ°í½Í´Ù
05/28 70
1583   ÆÄÀ̽㠼ÒÄÏ ÇÁ·Î±×·¡¹ÖÀÇ ±âÃÊ     ÇØÅ·ÀßÇÏ°í½Í´Ù
05/26 87
1582   ¸®´ª½º À¥ ·Î±× ºÐ¼®     ÇØÅ·ÀßÇÏ°í½Í´Ù
05/20 74
1581   ¸®´ª½º/À©µµ¿ì º¸¾È Àåºñ ·Î±×     ÇØÅ·ÀßÇÏ°í½Í´Ù
05/20 83
1580   °í¼ö´ÔµéÀÇ µµ¿òÀ» ¹Þ°í ½Í½À´Ï´Ù     vbnm111
02/11 371
1579   ¸®´ª½º Ä¿³Î 2.6 ¹öÀü ÀÌÈÄÀÇ LKM     jdo
07/25 865
1578   ½©ÄÚµå ¸ðÀ½     ÇØÅ·ÀßÇÏ°í½Í´Ù
01/15 1699
1577   Call by value VS Call by Reference     ÇØÅ·ÀßÇÏ°í½Í´Ù
01/15 1056
1576   (²Ä¼ö) L.O.B Çѹ濡 Ŭ¸®¾îÇϱâ[2]     ÇØÅ·ÀßÇÏ°í½Í´Ù
01/14 1419
1575   towelroot.c (zip) ÄÚ¸àÆÃ.[1]     scube
08/18 3927
1574   levitator.c (¾Èµå·ÎÀÌµå ·çÆÃ) °ø°Ý ºÐ¼® ¼Ò½º ÄÚµå °øÀ¯.[4]     scube
08/17 3826
1573   ¹«·á Á¤º¸º¸¾È ±â¼úÀÎÀç ¾ç¼º °úÁ¤ ±³À°»ý ¸ðÁý     chanjung111
06/17 4655
1572   K-Shield ÁִϾî 5±â ¸ðÁý     lrtk
06/17 4374
1571   [ÆÁ] ÆÄÀ̽ã 2¼Ò½º¸¦ 3À¸·Î º¯°æÇØÁÖ´Â »çÀÌÆ®[3]     ÇѽÂÀç
05/13 4070
1570   ±¸±Û ¹é¸µÅ© ÀÛ¾÷ Áú¹®¿ä     wkatnxka
03/30 3494
1569   [ÆÁ] ¿ìºÐÅõ ¹Ì·¯¸µ¼­¹ö     ÇѽÂÀç
03/09 4197
1568 ºñ¹Ð±ÛÀÔ´Ï´Ù  °¨À»¸øÀâ°Ú³×¿ä¤Ì¤Ì     À×À×À×
01/15 3
1567   µ¥ºñ¾È °è¿­ ¸®´ª½º ÀÇÁ¸¼º ±úÁ³À»¶§ ÇØ°á¹ý     ÇѽÂÀç
11/27 4680
1 [2][3][4][5][6][7][8][9][10]..[80]

Copyright 1999-2024 Zeroboard / skin by Hackerschool.org / Secure Patch by Hackerschool.org