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