±àд°²È«´úÂ룺Êý×éºÍÖ¸ÕëµÄ±¾ÖÊÒÔ¼°ºÎʱ²»ÄÜ»¥»»
(2011-06-26 21:38)
±¾ÎĵÄcopyleft¹égfree.wind@gmail.comËùÓУ¬Ê¹ÓÃGPL·¢²¼£¬¿ÉÒÔ×ÔÓÉ¿½±´£¬×ªÔØ¡£µ«×ªÔØÇë±£³ÖÎĵµµÄÍêÕûÐÔ£¬×¢Ã÷Ô×÷Õß¼°ÔÁ´½Ó£¬ÑϽûÓÃÓÚÈκÎÉÌÒµÓÃ;¡£
×÷Õߣºgfree.wind@gmail.com
²©¿Í£ºlinuxfocus.blog.chinaunix.net
½ñÌ죬Ö÷ÒªÑо¿Ò»ÏÂÊý×éºÍÖ¸ÕëµÄ±¾ÖÊ£¬¼´ËüÃǵ½µ×ÊÇʲô£¿£¨ÏÂÎͼÊÇÎÒ×Ô¼ºµÄÀí½â£¬Ò²Ðí²»¹»×¼È·£¬»¶Ó´ó¼ÒÅÄש£©
Çë¿´ÏÂÃæµÄ´úÂ룺
- #include <stdlib.h>
-
#include <stdio.h>
-
-
int main()
-
{
-
int array[4] = {0};
-
int *pointer = NULL;
-
int value = 0;
-
-
value = array;
-
value = &array;
-
value = array[0];
-
value = &array[0];
-
value = point;
-
value = &point;
-
-
return 0;
- }
ÏÂÃæÊǸÃC³ÌÐòµÄ»ã±à´úÂ룺
- 1 0x08048394 <+0>: push %ebp
-
2 0x08048395 <+1>: mov %esp,%ebp
-
3 0x08048397 <+3>: sub $0x20,%esp
- /*
- µÚ4ÐÐÖÁµÚ7ÐжÔÓ¦C´úÂëint array[4] = {0};
- ÕâÀï˵Ã÷Êý×éÖ»ÊÇÒ»¸öͬÀàÐͱäÁ¿µÄÄÚ´æ¿Õ¼äµÄ¼¯ºÏ¡£
- ¶ÔÓ¦Õâ¸öÀý×Ó£¬ÔÚÕ»ÉÏÉêÇëÁË4¸öÕûÐαäÁ¿µÄ¿Õ¼ä¡£
- */
-
4 0x0804839a <+6>: movl $0x0,-0x14(%ebp)
-
5 0x080483a1 <+13>: movl $0x0,-0x10(%ebp)
-
6 0x080483a8 <+20>: movl $0x0,-0xc(%ebp)
-
7 0x080483af <+27>: movl $0x0,-0x8(%ebp)
- /*
- µÚ8ÐжÔÓ¦int *point = NULL;
- ÕâÀï˵Ã÷Ö¸Õë±¾Éí×Ô¼ºÒ²ÊÇÒ»¸ö±äÁ¿£¬Í¬ÑùÕ¼ÓÃÁËÕ»µÄ¿Õ¼ä¡£
- ÔÚÕâ´¦Òª¶Ô±ÈÊý×éµÄ´¦Àí£¬Êý×éµÄÕ¼ÓõĿռäʵ¼ÊÉÏÊÇÊý×éÖеÄÔªËØËùÕ¼Óõġ£
- ÔÚ±¾ÀýÖУ¬¼´array[0],array[1],array[2],array[3]£¬¶øarray±¾Éíʵ¼ÊÉϸüÏñÒ»¸ölabel¡£
- */
-
8 0x080483b6 <+34>: movl $0x0,-0x18(%ebp)
- // µÚ9ÐжÔÓ¦int value = 0;
-
9 0x080483bd <+41>: movl $0x0,-0x4(%ebp)
- /*
- 10~11ÐУ¬¶ÔÓ¦´úÂëvalue = array
- ÒòΪarrayÖ»ÊÇÒ»¸öÊý×éµÄÃû³Æ£¬ËùÒÔvalue = array¾ÍÊǽ«arrayÊý×éµÄÊ×ÔªËØµÄµØÖ·¸³¸øvalue¡£
- Õâ¸öÓ¦¸Ã¾ÍÊÇC±ê×¼µÄÒ»¸ö¹æÔò¡£ÕâÒ²ÊÇ×îºÏÀíµÄÐÐΪ£¬ÒòΪÈç¹û²»ÊÇÈ¡arrayÊý×éµÄÊ×µØÖ·£¬ÆäËüµÄÐÐΪ¸ü¼ÓûÓÐÒâ Òå¡£
- */
-
10 0x080483c4 <+48>: lea -0x14(%ebp),%eax
-
11 0x080483c7 <+51>: mov %eax,-0x4(%ebp)
- /*
- 12~13ÐУ¬¶ÔÓ¦´úÂëvalue = &array
- ´ÓCÓïÑÔµÄÓïÒåÉÏ¿´£¬¾ÍÊÇÈ¡arrayµÄµØÖ·¡£
- ´Ó»ã±àÉÏ¿´£¬Ò²ÊÇÈ¡arrayÊý×éµÄÊ×ÔªËØµÄµØÖ·¡£
- */
-
12 0x080483ca <+54>: lea -0x14(%ebp),%eax
-
13 0x080483cd <+57>: mov %eax,-0x4(%ebp)
- /*
- 14~15ÐÐ, ¶ÔÓ¦´úÂëvalue = array[0]
- ÕâÀïÓëÉÏÎIJ»Í¬£¬È¡Êý×éµÄÄÚÈݸ³¸øvalue
- */
-
14 0x080483d0 <+60>: mov -0x14(%ebp),%eax
-
15 0x080483d3 <+63>: mov %eax,-0x4(%ebp)
- /*
- 16~17ÐУ¬¶ÔÓ¦´úÂëvalue = &array[0]
- ºÜÃ÷ÏÔ£¬È¡array[0]µÄµØÖ·¸³¸øvalue
- */
-
16 0x080483d6 <+66>: lea -0x14(%ebp),%eax
-
17 0x080483d9 <+69>: mov %eax,-0x4(%ebp)
- /*
- 18~19ÐУ¬¶ÔÓ¦´úÂëvalue = pointer;
- °´ÕÕÉÏÎĵÄ˵Ã÷£¬Ö¸Õë±¾Éí¾ÍÊÇÒ»¸ö±äÁ¿£¬ËùÒÔÕâÀï¾ÍÊǽ«Õâ¸ö±äÁ¿µÄÖµ¸³¸øvalue£¬¼´pointerµÄÖµ¸³¸øvalue£¬
- Ò²¾ÍÊÇ0.
×¢ÒâÕâÀïÓëvalue=arrayµÄÇø±ð¡£ÒòΪָÕë±¾Éí¾ÍÊÇÒ»¸ö±äÁ¿£¬ËùÒÔvalue = pointerµÄºÏÀíÓïÒå¾ÍÊǽ«pointerµÄ Öµ¸³¸øvalue£¬¶øarray±¾Éí²¢²»ÊÇÒ»¸ö±äÁ¿£¬ËùÒÔvalue=arrayµÄÓïÒ壬ҲÊǽ«arrayµÄÊý×éÊ×ÔªËØµÄµØÖ·¸³¸øvalue¡£
- */
-
18 0x080483dc <+72>: mov -0x18(%ebp),%eax
-
19 0x080483df <+75>: mov %eax,-0x4(%ebp)
- /*
- 20~21ÐУ¬¶ÔÓ¦´úÂëvalue = &pointer£»
- È¡pointerµÄµØÖ·¸³¸øvalue
- */
-
20 0x080483e2 <+78>: lea -0x18(%ebp),%eax
- 21 0x080483e5 <+81>: mov %eax,-0x4(%ebp)
- /*
- 22~24ÐУ¬¶ÔÓ¦´úÂëvalue = *pointer;
- È¡poniter±£´æµÄÖµ£¬½«Õâ¸öÖµ×÷Ϊһ¸öµØÖ·£¬È»ºóÈ¡¸ÃµØÖ·µÄÖµ¸³¸øvalue¡£
- ÔÚÕâÀpointerµÄÖµÊÇ0£¬ËùÒÔÕâ¾ä»°µÄÓïÒåÊÇ´ÓpointerÈ¡³öËüµÄÖµ0£¬È»ºó´ÓµØÖ·0ȡֵ¸³¸øvalue¡£
- µ±È»£¬Èç¹ûÖ´Ðе½ÕâÀ³ÌÐò»ácrash¡£ÒòΪµØÖ·0Ϊ·Ç·¨µØÖ·¡£
- */
- 22 0x080483e8 <+84>: mov -0x18(%ebp),%eax
- 23 0x080483eb <+87>: mov (%eax),%eax
- 24 0x080483ed <+89>: %eax,-0x4(%ebp)
-
22 0x080483f0 <+92>: mov $0x0,%eax
-
23 0x080483f5 <+97>: leave
- 24 0x080483f6 <+98>: ret
´ÓÉÏÃæµÄ·ÖÎöÖУ¬¿ÉÒÔ¿´³ö£¬¾¡¹Ü´ó¶àÊýÇé¿öÏ£¬Êý×éºÍÖ¸Õë¿ÉÒÔͨÓᣵ«ÊÇÓÉÓÚ¶ÔÓÚ&·ûºÅµÄ²»Í¬µÄÓïÒå½âÊÍ£¬ÔÚÓÐ&µÄÇé¿öϵĴúÂ룬Êý×éºÍÖ¸ÕëÊÇÎÞ·¨Í¨Óõġ£
Çë¿´ÏÂÃæµÄ´úÂë
- #include <stdlib.h>
-
#include <stdio.h>
-
-
-
static void show_str_pointer(const char **ppstr)
-
{
-
printf("%s\n", *ppstr);
-
}
-
-
int main()
-
{
-
char array[4] = "abc";
-
char *pointer = "abc";
-
-
show_str_pointer(&pointer);
-
show_str_pointer(&array);
-
-
return 0;
- }
Ö´Ðнá¹ûΪ£º
abc
7�
ÆäÖÐshow_str_pointer(&pointer)µÄÊä³ö½á¹ûΪÎÒÃÇËùÆÚÍûµÄ£¬¶øshow_str_pointer(&array)µÄÊä³öΪÂÒÂë¡£
Æä¸ù±¾ÔÒò¾ÍÊÇÒòΪÉÏÃæËù½ÒʾµÄÊý×éºÍÖ¸ÕëµÄ±¾Öʲ»Í¬, &arrayÓëarrayµÄÓïÒåÏàͬ¡£ÔÚÕâÀïÖ¸ÕëÓëÊý×éÊDz»ÄÜ»¥»»µÄ¡£&pointerΪָÕëµÄµØÖ·£¬Óëshow_str_pointer²ÎÊýchar**ppstr£¬Ö¸ÏòÖ¸ÕëµÄÖ¸ÕëµÄ±äÁ¿ÀàÐÍÏàͬ¡£¶ø&arrayÈÔȻΪÊý×鵨ַ£¬Óë²ÎÊýchar **ppstrµÄÀàÐͲ»·û¡£
×îºóÏ£Íû£¬´ó¼Ò´ÓÉÏÃæµÄ·ÖÎöºÍÀý×ÓÖУ¬¿ÉÒÔÀí½âÊý×éºÍÖ¸ÕëµÄ±¾ÖÊ£¬ÒÔ¼°ºÎʱËüÃÇÖ®¼ä¿ÉÒÔ»¥»»£¬ºÎʱ²»ÄÜ»¥»»¡£



ÕâЩ¶«¶«ÈÃÎÒÏëÆðCÖн²µÄ×óÖµ£¬ÓÒÖµ£¡£¡
¾õµÃ&£¨&a£©²»ÐеĵÀÀíºÍ 1 = a;Ò»Ñù¡£¡£¡£
ºÇºÇ¡£¡£¡£¹Ø×¢Ò»ÏÂÄã.....
¶ø»ã±àÊÇ»úÆ÷ÓïÑԵijéÏ󣬲»¹ýÎÒ»¹Ã»ÓÐÐËȤ¿´»úÆ÷ÓïÑÔºÇ
Ö§³ÖÍÚ·Ø£¬Ö§³ÖÌÖÂÛ¡£
Äã˵µÄ&(&a)²»ÐеĵÀÀíȷʵºÍ1=aÒ»Ñù¡£
ÕâЩ¶«¶«ÈÃÎÒÏëÆðCÖн²µÄ×óÖµ£¬ÓÒÖµ£¡£¡
¾õµÃ&£¨&a£©²»ÐеĵÀÀíºÍ 1 = a;Ò»Ñù¡£¡£¡£
ºÇºÇ¡£¡£¡£¹Ø×¢Ò»ÏÂÄãµÄblog..ÍÚ·ØÃ»Òâ¼û°É
char *pointer = "abc";
show_str_pointer(&pointer);
show_str_pointer(&array);
Õâ¶Î´úÂë.....
int a=10;
ÓÃ&(&(&...(&a))),´«µØÖ·¡¢È»ºó*(*(*...(*a)))À´È¡ÖµÁË¡£
ÏÔÈ»ÕâÑùÐв»Í¨.....
µ«ÊÇÓÐÒ»¸öÎÊÌâÊÇ
±ÈÈçint a = 10;
µ±Ê¹ÓÃ&(&a)»á±àÒë³ö´í£¬ÒòΪ&aÊÇÒ»¸öµØÖ·£¬ÔÙ´Î&&aʱ»á³ö´í¡£
¶øint a[] = {0};
Èç¹û±àÒëÆ÷½ö½ö°Ñaµ±×÷ÊÇÒ»¸öµØÖ·µÄ»°£¬ÔÙ´Î&aͬÑùÒ²Ó¦¸Ã±¨´í¡£
ËùÒÔ¶ÔÓÚÊý×éaÀ´Ëµ£¬²¢²»ÊÇÒ»¸ö¼òµ¥µÄµØÖ·¡£Êµ¼ÊÉ϶ÔÓÚÊý×éÀ´Ëµarray=&array
int a=10;
ÓÃ&(&(&...(&a))),´«µØÖ·¡¢È»ºó*(*(*...(*a)))À´È¡ÖµÁË¡£
ÏÔÈ»ÕâÑùÐв»Í¨
char *pointer = "abc";
show_str_pointer(&pointer);
show_str_pointer(&array);
Õâ¶Î´úÂëÊDz»ÊÇÓÐÎÊÌ⣿
array±¾Éí¾ÍÊǸöµØÖ·£¬&arrayÕâÖÖ×ö·¨±¾ÉíºÃÏñÊÇȡһ¸öµØÖ·µÄµØÖ·£¬³ö´íÊDZØÈ»µÄ¡£¾ÍÏñÊǶ¨ÒåÁËÒ»¸ö±äÁ¿£¬ÔÙÈ¡±äÁ¿µÄµØÖ·µÄµØÖ·.
int a=10;
&£¨&a£©,ÕâÖÖ×ö·¨£¬&(&a)¾ÍÓÐÎÊÌâÁË
²»ÖªµÀÒÔÉÏ˵·¨½öΪ̽ÌÖ£¬²»ÖªµÀÊÇ·ñÕýÈ·£¬Èç²»ÕýÈ·£¬ÇëÖ¸Õý¡£