1581, 12/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 : 6064     Date : 2012/07/12 05:54



    
1361   È®ÀåÀÚ°¡ exe°¡ ¾Æ´Ñ ÀÀ¿ë ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°í ½Í´Ù?[4]     karineko
04/29 6032
1360   ¿ö°ÔÀÓ ¹®Á¦ ÈùÆ®Á» ÁֽǺР±¸ÇÔ     rabbitlycat
04/30 6033
1359   ´Ù¾çÇÑ ¹®ÀÚµé[2]     sdc04303
05/13 6040
1358   [ÀÚÀÛ±Û]C¾ð¾î, Á¶°Ç¹®°³³ä (Ç®ÀÌÆ÷ÇÔ)[1]     ÇѽÂÀç
01/17 6043
1357   ºÎŹµå·Á¿ä[1]     rabbitlycat
05/08 6048
1356   [C±âÃÊ] 10 - ÇÔ¼ö¸¦ Á¦´ë·Î ¾Ë°í ½áº¸ÀÚ!      sihun1113
05/01 6053
1355   [ÀÚÀÛ]M's HTML Lecture 4[1]     Myers
05/02 6057
1354   ³ëÆ®ºÏ Ãßõ[3]     BLUE58
12/30 6058
1353   [C]Àç±Í     BLu2Scr22n
02/13 6059
  [ÀÚÀÛ] C °­ÁÂ [6] - Pointer & Array     wolverine
07/12 6063
1351   [Æß]¡áƯÁ¤ ÇÁ·Î¼¼½º°¡ ¹®Á¦°¡ ¹ß»ýÇßÀ» °æ¿ì¿¡ ÀÛ¾÷ÇÏ´Â ÀýÂ÷ ¹æ¹ý[2]     BLu2Scr22n
01/29 6078
1350   ÄÄÇ»ÅÍ ´ëÇб³¸¦ °¡°í½ÍÀºµ¥ ¾îµð°¡ Á¦ÀÏ ÁÁÀ»±î¿ä??[4]     ppuuv8585
06/23 6090
1349   c¾ð¾î°­ÀÇ 1-ÄÄÆÄÀÏ·¯¶õ?(ÄÄÆÄÀÏ·¯Ã·ºÎ)[2]     sihun1113
04/30 6091
1348   [Æß]etc °ü·Ã ¸í·É¾î [2]     BLu2Scr22n
01/27 6091
1347   [C±âÃÊ] 05 - Æ÷ÀÎÅÍÀÇ ¿ä¼Ò ¹× Ư¡      sihun1113
05/01 6098
1346   [C±âÃÊ] C ¿Í C++ ÀÇ Æ¯Â¡[1]     Cpgroot
07/05 6110
1345   putty     solver
10/22 6110
1344   µð¹ö±ë[3]     sibu02003
05/10 6112
1343   ÇØÅ·°¡¸£ÃÄ ÁֽǺР±¸ÇØ¿ä~!~![3]     rnfn9
02/11 6113
1342   Á¤¸».....Áö¹æÀº[11]     intmain1202
10/25 6125
[1]..[11] 12 [13][14][15][16][17][18][19][20]..[80]

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