數組名a作為左值和右值的區別


  簡單而言,出現在賦值符“=”右邊的就是右值,出現在賦值符“=”左邊的就是左值。

  比如,x=y。

  左值:在這個上下文環境中,編譯器認為x的含義是x所代表的地址。這個地址只有編譯器知道,在編譯的時候確定,編譯器在一個特定的區域保存這個地址,我們完全不必考慮這個地址保存在哪里。

  右值:在這個上下文環境中,編譯器任務y的含義是y所代表的地址里面的內容。這個內容是什么,只有到運行時才知道

 

  C語言引入一個術語——“可修改的左值”。意思就是,出現在賦值符左邊的符號所代表的地址上的內容一定是可以被修改的。換句話說,就是我們只能給非只讀變量賦值。

  

  既然已經明白左值和右值的區別,那么下面就討論一下數組作為左值和右值的情況。

  當a作為右值的時候代表什么意思呢?很多書認為是數組的首地址,其實這是非常錯誤的。a作為右值時其意義與&a[0]是一樣的,代表的是數組首元素的首地址,而不是數組的首地址(用在表達式sizof(a)中時,a表示的是數組名,此時a並沒有被用作右值),這是兩碼事。但是注意,這僅僅是代表,並沒有一個地方(這只是簡單地這么認為,其具體實現細節不做過多討論)來存儲這個地址,也就是說,編譯器並沒有為數組a分配一塊內存來存儲其地址,這一點就與指針有很大的差別。

  a不能作為左值!這個錯誤幾乎每一個學生都犯過。編譯器會認為數組名作為左值代表的意思是a的首元素的首地址,但是這個地址開始的一塊內存是一個總體,我們只能訪問數組的某個元素,而無法把數組當做一個總體進行訪問。所以我們可以把a[i]當左值,而無法把a當左值。其實我們完全可以把a當做一個普通的變量來看,只不過這個變量內部分為很多小塊,只能通過分別訪問這些小塊來達到訪問整個變量a的目的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM