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



    
1365     [re] ÇãÁ¢ÆÁ] ¾ÏÈ£¸¦ ¹Ù²ã ÇØÅ·ÇÇÇØ ÁÙÀÌÀ𠤻 ^^; ´õ ÁÁÀº¹æ¹ý[9]     xeon400
10/14 9463
1364   ¸®¹ö½Ì Á÷Á¢ °øºÎÇϽǼö ÀÖ°Ô Çص帳´Ï´Ù.[1]     xellos1234
01/07 5335
1363   ¸®´ª½º ·Î±×Á¤¸® µµ±¸ - nabi2.c[7]     x90c
03/07 11258
1362   À©µµ¿ìÁî XP SP1 WFP (Windows File Protection) ²ô±â[1]     x90c
03/05 11890
1361   OpenVMS Tutorial[4]     x90c
02/23 17834
1360   OpenVMS ¿î¿µÃ¼Á¦ÀÇ WASD À¥¼­¹ö ¿©·¯ Ãë¾à¼ºÀÇ ÀÌÇØ     x90c
02/18 9670
1359   ÀÓº£µðµå ½Ã½ºÅÛ¶õ?[3]     X-line
12/18 8709
1358   Windows¿¡¼­ Linux ºÎÆõð½ºÄÏ ¸¸µå´Â¹ý[8]     X-line
12/18 7584
1357   Ä¿³Î ÄÄÆÄÀÏ[2]     X-line
12/15 7825
1356   ¸®´ª½º ¼³Ä¡¿ì x-window°¡ ¾ÈµÉ¶§[1]     X-line
12/15 8683
1355   ¸®´ª½º ¿©·¯°¡Áö ¼³Ä¡¹æ¹ý[1]     X-line
12/15 8836
1354   Äھ´ª½ºOS ISO À̹ÌÁö ¼³Ä¡ ¹æ¹ý     X-line
12/15 8085
1353   man ÆäÀÌÁö ºÐ·ù¿Í ÀǹÌ[6]     X-line
12/15 7861
1352   ¸®´ª½º¿¡¼­ cÇÁ·Î±×·¥ ½Ç½ÀÇϱâ[2]     X-line
12/14 9703
1351   ³ªºñ¸¦ ¾Ë¾Æº¸ÀÚ[5]     X-line
12/09 8893
1350 ºñ¹Ð±ÛÀÔ´Ï´Ù  [ÀÚÀÛ] ¸®´ª½º&À©µµ¿ì ¸í·É¾î ºñ±³ -1     wva11cdae
07/19 0
1349   DOSâ¿¡¼­ »à!»à~»à~ ÀÚÀ¯ÀÚÀç·Î ¼Ò¸®³»±â~[4]     worldcjh1
02/23 8041
1348   [ÀÚÀÛ] C °­ÁÂ [7] - PointerÀÇ È°¿ë (Device Driver)[2]     wolverine
07/13 6777
  [ÀÚÀÛ] C °­ÁÂ [6] - Pointer & Array     wolverine
07/12 6097
1346   [ÀÚÀÛ] C °­ÁÂ [5] - Pointer     wolverine
07/11 7986
[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