小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

(todo)數(shù)組名 有存儲空間嗎?

 lchjczw 2012-11-23
對于數(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]=10a是直接堆棧操作,因為它是一個地址,沒有存儲空間 
 
mov byte   ptr   [si+2],20       ;這個是p[2]=20p是個變量,它被保存在寄存器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ù)組對象的長度。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多