void func()
{
int arr[5]={1,2,3,4,5};
int variable = arr[1]; //variable will be set to 2
}
当执行该程åºæ—¶ï¼Œå°†åœ¨è™šæ‹Ÿåœ°å€ç©ºé—´çš„å †æ ˆåŒºåŸŸä¸åˆ†é…相当于5个整数的连ç»å†…å˜ï¼Œå¦‚下所示为5个整数的数组。
+---+
| | a[0]
+---+
| | a[1]
+---+
| | a[2]
+---+
| | a[3]
+---+
| | a[4]
+---+
在数组å˜é‡arr
本身分é…的虚拟地å€ç©ºé—´ï¼ˆä»£ç /æ•°æ®/å †æ ˆ/å †æ®µï¼‰ä¸æ˜¯å¦æœ‰ç©ºæ ¼è€Œä¸æ˜¯5个整数数组?
如果未分é…,则
考虑代ç 片段 - int variable = arr[1];
,它将由编译器转æ¢ä¸º*(arr+1)
,并将出现在地å€ç©ºé—´çš„代ç 段ä¸ï¼Œå³åªè¯»ã€‚
在æ¯ä¸ªå‡½æ•°è°ƒç”¨arr
期间,arr
如何计算到数组func
的起始地å€ï¼Ÿç”±äºŽæ¯æ¬¡è°ƒç”¨è¯¥å‡½æ•°æ—¶ï¼Œè°ƒç”¨å †æ ˆçš„地å€éƒ½å¯èƒ½å‘生å˜åŒ–ï¼Œå› æ¤æ•°ç»„arr
的地å€ä¹Ÿä¼šå‘生å˜åŒ–。
å› æ¤ï¼Œå¦‚果没有为数组å˜é‡arr
æä¾›å•ç‹¬çš„空间,那么如何实现呢?
ç”案 0 :(得分:1)
 Â在æ¯ä¸ªå‡½æ•°è°ƒç”¨
arr
期间,arr
如何计算到数组func
的起始地å€ï¼Ÿ
在x86架构上的典型实现ä¸ï¼Œarr
çš„ä½ç½®å°†å–å†³äºŽå †æ ˆæŒ‡é’ˆï¼ˆesp
)或帧指针(ebp
),å³ï¼šå®ƒå°†é€šè¿‡åº”用固定å移é‡æŒ‰ç…§å…¶ä¸ä¸€ä¸ªæŒ‡é’ˆå¯„å˜å™¨è¿›è¡Œå®šä¹‰ã€‚
对func()
çš„æ¯æ¬¡è°ƒç”¨å¯èƒ½æœ‰æ‰€ä¸åŒçš„是这些指针寄å˜å™¨çš„值,而ä¸å¦‚何定义arr
的术è¯é‚£äº›ï¼ˆå³ï¼šå›ºå®šçš„å移é‡ï¼‰ã€‚
ç”案 1 :(得分:0)
åœ¨ç¼–è¯‘å™¨æž„é€ ä¸æœ‰ä¸€ä¸ªå«åšç¬¦å·è¡¨çš„东西。符å·è¡¨å˜å‚¨å称arr
和地å€ï¼ˆå¯ä»¥æ˜¯åŸºäºŽè¿›ç¨‹çš„地å€ç©ºé—´çš„å移é‡ï¼‰ã€‚然åŽï¼Œåªè¦ç¼–译器看到æ¤arr[1]
,它就会生æˆå¿…è¦çš„汇编代ç ,以便从MOV
表示的内å˜åœ°å€ä¸èŽ·å–LOAD
或*(arr+1)
指令。 +1
的算法由编译器确定它指å‘的类型æ¥å®Œæˆã€‚符å·è¡¨ç”¨äºŽä¿å˜å˜é‡çš„内å˜åœ°å€ä¿¡æ¯ã€‚ (例如: - 在函数的情况下,分é…ç»™å®ƒçš„å †æ ˆå¸§å†³å®šäº†æˆ‘ä»¬ç”¨arr
çš„å称指定的连ç»å†…å˜çš„起始地å€æ˜¯ä»€ä¹ˆ - 这就是为什么它会也å¯ä»¥æ”¹å˜ï¼Œå› 为分é…ç»™æŸä¸ªåŠŸèƒ½çš„内å˜åœ¨æ¯æ¬¡è°ƒç”¨æ—¶éƒ½ä¼šæœ‰æ‰€ä¸åŒã€‚)