|
對于數(shù)組b[],b是數(shù)組的地址,但b不算變量,有沒有一個地方存放b?而且b是不 是存放的就是自己所在的地址。 ------------------------------------------------------------- 數(shù)組名不是對象,數(shù)組才是對象,指針也是一種對象,因此,數(shù)組名并沒有內(nèi)存空間,它是一個右值。想看具體的代碼么?把下面的代碼匯編一下,就可以看見其區(qū)別了: char a[10]; char *p; p=a; a[2]=10; p[2]=20; 編譯器編譯后的匯編代碼是這樣的: _main proc near push bp mov bp,sp sub sp,10 push si lea si,word ptr [bp-10] ;這個就是p=a,p被保存在某個地方,這里p被優(yōu)化為保存在寄存器 mov byte ptr [bp-8],10 ;這個是a[2]=10,a是直接堆棧操作,因為它是一個地址,沒有存儲空間 mov byte ptr [si+2],20 ;這個是p[2]=20,p是個變量,它被保存在寄存器si里面,因此進行操作時,要先取si的值,然后+2,再進行間接尋址 xor ax,ax jmp short @1 如果數(shù)組名是一個變量的話,那就必定得先把bp-10保存在某個地方,例如di,就會產(chǎn)生下面的指令:lea di, word ptr[bp-10],事實是,編譯器并沒有這樣做,而是直接堆棧操作。 char *a[2]; 那么a的值和&a的值是不是應該一樣? ----------------------------------- 關(guān)于對數(shù)組名取地址的問題,由于數(shù)組名是右值,本來&a是不合法的,早期不少編譯器就是指定&a是非法的,但后來C89/C99認為數(shù)組符合對象的語義,對一個對象取地址是合理的,因此,從維護對象的完整性出發(fā),也允許&a,只不過,&a的意義,并非對一個數(shù)組名取地址,而是對一個數(shù)組對象取地址,也正因為如此,a才跟&a所代表的地址值一樣,同時sizeof(a)應該跟sizeof(&a)一樣,因為sizeof(&a)代表取一個數(shù)組對象的長度。 |
|
|