本文地址:http://blogold.chinaunix.net/u3/95713/showart_2395695.html
c語言中指針和數組在編譯時的區別 例如:int a[10]和int *b,a[5]和*(b+5) 在編譯的時候區別是什麼? 經過反覆的查資料和請教他人,最後在《c專家編程》裏找到了很好的答案。
1。編譯器對數組名和指針變量的處理方式
編譯器在編譯時會產生一個符號表,記錄了符號名和它的地址。對於指針變量,這顯然很好理解。而數組名就不那麼明顯了,它僅僅是一個符號而已,何來地址?編譯器是這樣處理的,它記錄了array[0]的地址;這和我們通常的理解也是一樣的。
2。帶下標形式的數組和指針尋址方式
(1)數組情形
char a[9]="abcdefgh";
...
c=a[i];
在編譯期,會在符號表中創建這樣一條記錄:
name:a address:9980
要獲取a[i]的值分兩個步驟:
step 1:取得i的值並和9980相加
step 2:在內存地址(9980+i)處取其內容
(2)指針情形
char* p="abcdefgh";
...
c=p[i];
在編譯期,會在符號表中創建這樣一條記錄:
name:p address:4624
要獲取p[i]的值分三個步驟:
step 1:在內存地址4624處取其內容,比如說“5081”
step 2:取得i的值並和5081相加
step 3:在內存地址(5081+i)取其內容