【轉】數組和指針在編譯的時候的區別

本文地址: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)取其內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章