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
|