1585, 12/80 ȸ¿ø°¡ÀÔ  ·Î±×ÀΠ 
   wolverine
   [ÀÚÀÛ] C °­ÁÂ [5] - Pointer

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



À̹ø Àå¿¡¼­´Â pointer¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.

pointer´Â memory address¸¦ ÅëÇÑ º¯¼ö access(read/write)¸¦ À§Çؼ­ ÇÊ¿äÇÑ °³³äÀÔ´Ï´Ù.
C¿¡¼­ ¾Æ·¡¿Í °°ÀÌ º¯¼ö¸¦ ¼±¾ðÇÒ ¼ö ÀÖ½À´Ï´Ù.

int a;
unsigned short b;
char c;

¿©±â¿¡¼­ int, unsigned short, char ¿Í °°Àº °ÍÀ» type keyword ¶ó°í ÇÕ´Ï´Ù.
ÀÌ·¯ÇÑ type keyword´Â compilerÀÇÇؼ­ ÀνÄÀÌ µË´Ï´Ù.
a,b,c ¿Í °°Àº °ÍµéÀ» variable instance¶ó°í ÇÕ´Ï´Ù.

Áï, int typeÀ¸·Î 'a'¶ó´Â instance¸¦ ¸¸µé¾î¼­ ÀÌ¿ëÀ» ÇÏ°Ú´Ù¶ó´Â ¶æÀ̸ç,
compiler/linker´Â 'a'¶ó´Â º¯¼ö¸¦ ƯÁ¤ memory address¿¡ mappingÀ» ½ÃÄѼ­
½ÇÁúÀûÀ¸·Î processor´Â memory address¸¦ ±â¹ÝÀ¸·Î access(read/write)¸¦ ¼öÇàÇÕ´Ï´Ù.

[Note]
C´Â high level languageÀ̱⠶§¹®¿¡,
ÄÚµùÀ» ÇÏ´Â °³¹ßÀÚ´Â a¶ó´Â º¯¼öÀÇ memory ¹øÁö°¡ ¾îµðÀÎÁö ½Å°æ¾µ ÇÊ¿ä¾øÀÌ,
´Ü¼øÈ÷ a ¶ó´Â º¯¼öÀÇ À̸§À¸·Î ÆíÇÏ°Ô access¸¦ ÇÒ ¼ö ÀÖ½À´Ï´Ù.
ÇÏÁö¸¸, Ưº°ÇÑ °æ¿ì¿¡´Â a°¡ ÇÒ´çµÇ´Â memory address¸¦ Á÷Á¢ ÁöÁ¤ÇØ ÁÙ ¼öµµ ÀÖ½À´Ï´Ù.

½ÇÁ¦ compileµÈ instruction(machine code)Àº
a,b¿Í °°Àº ³í¸®ÀûÀÎ À̸§À¸·Î º¯¼ö¸¦ accessÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó,
Ç×»ó compiler/linker¿¡ ÀÇÇؼ­ mappingµÈ address¸¦ ±â¹ÝÀ¸·Î ÇØ´ç º¯¼ö¸¦ accessÇÏ°Ô µË´Ï´Ù.

int a;
a = 1;
printf("%x", a);

¶ó´Â ÄÚµå´Â È­¸é¿¡ a¿¡ ÀúÀåµÇ¾î ÀÖ´Â '1' À̶ó´Â °ªÀ» Ãâ·ÂÇÏ°Ô µË´Ï´Ù.

¹Ý¸é¿¡,

printf("%x", &a);

¶ó´Â ÄÚµå´Â È­¸é¿¡ 1000f000(¿¹) °ú °°Àº a¶ó´Â º¯¼ö°¡ mappingµÈ address¸¦ Ãâ·ÂÇÏ°Ô µË´Ï´Ù.

¿©±â¼­ º¯¼öÀ̸§ ¾Õ¿¡ ºÙÀº '&'¶ó´Â ±âÈ£´Â address¸¦ ³ªÅ¸³À´Ï´Ù.
Áï, '&a'´Â º¯¼ö aÀÇ address¸¦ ¸»ÇÕ´Ï´Ù.

ÀÚ ±×·³, pointer´Â ÁÖ·Î ¾ðÁ¦ ÀÌ¿ëÀ» ÇÒ±î¿ä?

void func1(int a, int b, int c)
{
    c = a+b;
    return;
}

¶ó´Â ÇÔ¼ö°¡ Àִµ¥,
ÀÌ ÇÔ¼ö°¡ a+bÀÇ °ªÀ» c¿¡ ÀúÀåÇÏ´Â ±â´ÉÀ» Çϵµ·Ï ÇؾßÇÑ´Ù°í °¡Á¤À» Çغ¸ÁÒ.

int e;
int f;
int g;

e = 10;
f = 20;
g = 0;

func1(e,f,g);

¶ó°í Çϸé, g¿¡ ¿øÇÏ´Â °á°ú¸¦ Áý¾î ³ÖÀ» ¼ö ÀÖÀ»±î¿ä?

´äÀº ¾Æ´Ï¿À ÀÔ´Ï´Ù.

ÀÌ·¯ÇÑ °æ¿ì¸¦ call by value ¶ó°í ÇÕ´Ï´Ù.
ÇÔ¼ö°¡ value, Áï °ªÀ» ¸Å°³º¯¼ö·Î Çؼ­ È£Ã⠵Ǿú´Ù´Â ¶æÀÔ´Ï´Ù.
func1(int a, int b, int c) ³»ºÎ¿¡¼­ a,b,c´Â
¸Å°³º¯¼öÀÎ µ¿½Ã¿¡ local º¯¼ö ÀÔ´Ï´Ù.
Áï, a,b,c´Â func1ÀÇ life time°ú »ý»ç¸¦ °°ÀÌÇÏ°í,
func1ÀÌ ¹ÝȯµÇ´Â ½ÃÁ¡¿¡¼­ ±× »ý¸íÀ» ´ÙÇÏ°í ¾ø¾îÁö°Ô µË´Ï´Ù.

func1(e,f,g) ¶ó°í È£ÃâÀ» Çϸé,
func1(10,20,0) À̶ó°í È£ÃâÇÑ °Í°ú µ¿ÀÏÇÑ ÀÇ¹Ì ÀÔ´Ï´Ù.
func1ÀÇ ½ÃÀÛ°ú ÇÔ²²,
¸Å°³º¯¼ö a=10, b=20, c=0À¸·Î ÃʱâÈ­ µÇ¾î¼­,
func1 ³»ºÎ¿¡¼­ ÀÌ¿ëÀÌ µÇ´Â °Í ÀÔ´Ï´Ù.

µû¶ó¼­, c = a+b´Â g¿¡ °ªÀ» ÀúÀåÇÏÁö ¸øÇÏ°í,
´Ü¼øÈ÷ 0°ªÀ» °¡Áö°í ÀÖ´Â c¿¡ 30À̶ó´Â °á°ú¸¦ ÀúÀåÇÏ°í,
ÇÔ¼öÀÇ ¹Ýȯ°ú ÇÔ²², c´Â ¼Ò¸êµÇ¾î ¹ö¸®°Ô µË´Ï´Ù.

±×·¸´Ù¸é, g¿¡ func1ÀÇ °á°ú¸¦ ÀúÀåÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß ÇÒ±î¿ä?

ÀÌ·¯ÇÑ °æ¿ì pointer°¡ ÀÌ¿ëÀÌ µË´Ï´Ù.

int *c ¶ó°í ¼±¾ðÀ» Çϸé,
º¯¼ö c ¸¦ int º¯¼öÀÇ address¸¦ ÀúÀåÇÏ´Â º¯¼ö·Î »ç¿ëÇÏ°Ú´Ù´Â ÀÇ¹Ì ÀÔ´Ï´Ù.
¿©±â¼­ '*' ±âÈ£´Â pointer¸¦ ÀǹÌÇÕ´Ï´Ù.

Address´Â ¸» ±×´ë·Î ¹°¸®ÀûÀÎ address¸¦ ÀǹÌÇϸç,
Pointer´Â ÀÌ·¯ÇÑ address¸¦ ÀúÀåÇÏ´Â º¯¼ö¸¦ ÀÇ¹Ì ÇÕ´Ï´Ù.

int *c;
int d = 10;

c = &d;

¶ó°í Çϸé 'pointer º¯¼ö c' ´Â 'º¯¼ö d' ÀÇ address¸¦ ÀúÀåÇÏ°Ô µË´Ï´Ù.

¶ÇÇÑ *c ´Â 'pointer º¯¼ö c' °¡ pointing(ÁöÁ¤ÇÏ´Â)ÇÏ´Â ¸Þ¸ðÁö ¹øÁö¿¡ ÀúÀåµÈ °ªÀ» ÀǹÌÇϸç,

printf("%d", *c) ¿Í
printf("%d", d) ¸ðµÎ
´Â 10À̶ó´Â °ªÀ» Ãâ·ÂÇÕ´Ï´Ù.

±×·¸´Ù¸é, ÀÌ·¸°Ô º¹ÀâÇÑ pointer¸¦ ¿Ö ÀÌ¿ëÇÒ±î¿ä?

func1À» ¿øÇÏ´Â µ¥·Î ¸¸µé±â À§Çؼ­´Â ¾Æ·¡¿Í °°ÀÌ pointer¸¦ ÀÌ¿ëÇØ¾ß ÇÕ´Ï´Ù.

ÀÌ·¯ÇÑ °æ¿ì¸¦ call by reference¶ó°í ÇÕ´Ï´Ù.
Áï, pointer¸¦ ¸Å°³ º¯¼ö·Î ÇÔ¼ö°¡ È£ÃâµÇ¾ú´Ù´Â ÀǹÌÀÔ´Ï´Ù.

func2(int a, int b, int *c)
{
    *c = a+b;
    return;
}

func2(e,f,&g);

¶ó°í Çϸé,
¸Å°³º¯¼ö c¿¡´Â gÀÇ address°¡ Àü´ÞµÇ°í,
*c ¸¦ ÅëÇؼ­ °á°ú °ªÀ» ½ÇÁ¦ g¿¡ ÀúÀåÇÒ ¼ö ÀÖ½À´Ï´Ù.

¹°·Ð À§¿Í °°Àº ÇÔ¼ö´Â

int func3(int a, int b)
{
    return (a+b);
}

g = func3(a,b) ¿Í °°ÀÌ ÀÌ¿ëµÉ ¼ö ÀÖ½À´Ï´Ù.

ÀÌ·± °æ¿ì º¹ÀâÇÏ°Ô pointer¸¦ »ç¿ëÇÒ ÇÊ¿ä´Â ¾øÁÒ.

ÇÏÁö¸¸, Á»´õ ¹æ¾îÀûÀ¸·Î codingÀ» ÇÏ·Á°í Çϸé,
¾Æ·¡¿Í °°ÀÌ overflow À¯¹«µµ °°ÀÌ °á°ú °ªÀ» ¹ÝȯÇØ¾ß ÇÕ´Ï´Ù.
ÀÌ·± °æ¿ì returnÀ» ÅëÇؼ­ sum°á°ú¿Í overflow°á°ú¸¦ ÇÔ²² ¹ÝȯÇÏÁö ¸øÇÕ´Ï´Ù.
À̶§¿¡´Â ¹Ýµå½Ã pointer¸¦ ½á¼­ °á°ú¸¦ Àü´ÞÇÏ¿©¾ß ÇÕ´Ï´Ù.

int func4(int a, int b, int *c)
{
    int sum;
    int isOverflow;

    sum = a+b;

    /* overflow check */
    ....

    if(isOverflow){ /* overflow ÀÎ °æ¿ì */
        *c = 0;
    }
    else{ /* overflow°¡ ¾Æ´Ñ °æ¿ì */
        *c = sum;
    }

    return isOverflow;
}

r = func4(e,f,&g);

if(r){
    /* Overflow...do domething. */
    ...
}

¶ÇÇÑ pointer´Â array(¹è¿­)ÀÇ Àü´Þ¿¡ °¡Àå ¸¹ÀÌ ÀÌ¿ëÀÌ µË´Ï´Ù.

´ÙÀ½ Àå¿¡¼­´Â Array¿Í Pointer¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°í,
À̹ø ÀåÀº À̸¸ ¸¶Ä¡°Ú½À´Ï´Ù.

Pointer´Â C codeÀÇ °¡Àå Áß¿äÇÏ°í ±âº»ÀûÀÎ °³³äÀÔ´Ï´Ù.
»ç½Ç pointer´Â ÀÚÁÖ Á¢ÇÏ´Ù º¸¸é ±Ý¹æ Ä£¼÷ÇØ Áý´Ï´Ù.
Áß¿äÇÑ °Ç ¿Ö pointer¸¦ ÀÌ¿ëÇÏ´Â Áö¿¡ ´ëÇؼ­ °íÂûÀ» ÇØ¾ß ÇÑ´Ù´Â °ÍÀÔ´Ï´Ù.
À§ÀÇ ¿¹Á¦¿¡¼­ ó·³ ¿Ö pointer¸¦ ÀÌ¿ëÇØ¾ß ÇÏ´ÂÁö¿¡ ´ëÇؼ­ ÀÌÇظ¦ ÇÒ ¼ö ÀÖÀ¸¸é,
Á»´õ ½±°Ô pointer¸¦ ÀÌÇØÇÒ ¼ö ÀÖÀ» °Í ÀÔ´Ï´Ù.

Best Regards,
Wolverine


  Hit : 7986     Date : 2012/07/11 02:53



    
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 17833
1360   OpenVMS ¿î¿µÃ¼Á¦ÀÇ WASD À¥¼­¹ö ¿©·¯ Ãë¾à¼ºÀÇ ÀÌÇØ     x90c
02/18 9669
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 8682
1355   ¸®´ª½º ¿©·¯°¡Áö ¼³Ä¡¹æ¹ý[1]     X-line
12/15 8836
1354   Äھ´ª½ºOS ISO À̹ÌÁö ¼³Ä¡ ¹æ¹ý     X-line
12/15 8085
1353   man ÆäÀÌÁö ºÐ·ù¿Í ÀǹÌ[6]     X-line
12/15 7860
1352   ¸®´ª½º¿¡¼­ cÇÁ·Î±×·¥ ½Ç½ÀÇϱâ[2]     X-line
12/14 9702
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
1347   [ÀÚÀÛ] C °­ÁÂ [6] - Pointer & Array     wolverine
07/12 6096
  [ÀÚÀÛ] C °­ÁÂ [5] - Pointer     wolverine
07/11 7985
[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