第一次讓左值右值引起我注意的時候是在剛接觸字符串和指針的時候編譯器對代碼的一段錯誤提示
那什么是左值(l-value)那:
說的通俗一點就是可以放在賦值號左邊的叫左值 就是可以被賦值的。是一個地址
左值一般是是一個變量可以被賦值的變量。(const變量是一個例外只能做右值)
那什么是右值(r-value)那:
同樣我們可以說是可以放在賦值號右邊的 就是可以給其他變量賦值的,
它可以是一個變量也可以是一個常量也可以是一個表達式。是一個內容
例如:
#include<stdio.h> int main() { char name[20]; char *adress; name="小明"; //錯誤的 adress="南極"; //正確的 }
name="小明";
這個語句中 字符數組 name 就不是一個左值 因為name 在定義的時候它是被分配道內存的棧中,
而 "小明" 是存儲在內存的靜態常量中 ,它在賦值的時候是將這個靜態區的常量的首地址賦給一個指針變量,
所以name 字符數組不能做這里的左值 而且 name 本質上是一個數組 是將每個字符存儲在單元格中 ,
雖然在按字符串格式輸出的時候是一段字符串,但是實際上它本質上也是一個一個字符組到一起的。
如果要把一段字符串存儲在字符數組中就需要把一個一個字符存儲在數組中。
什么是表達式:
表達式由一個或多個操作數通過操作符組合而成。最簡單的表達式僅包含一個字面值常量或變量。較復雜的表達式則由操作符以及一個或多個操作數構成。
一個變量是表達式但是一個表達式就不一定是變量了。
確切一點說一個簡單的賦值語句
左值是一個地址 左值是左側表達式所代表的地址
右值是右側表達式所代表的內容。
但左值並不一定能被賦值,因為左值可以引用某個常量。 所有的引用都是左值。
右值是表達式的值(不是引用),可以放在賦值右面。
所以所有左值都可以做右值。
函數的引用參數
把參數聲明成引用,實際上改變了缺省的按值傳遞參數的傳遞機制。在按值傳遞時,函數操縱的是實參的本地拷貝。當參數是引用時,函數接收的是實參的左值而不是值的拷貝。
這意味着函數知道實參在內存中的位置,因而能夠改變它的值或取它的地址。