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
|