標籤:指標 c語言 運算式
在理解指標運算式之前先有一個概念就是“左值”和“右值”,對於左值就是可以出現在賦值符號左邊的東西,右值就是那些可以出現在賦值符號右邊的東西。進一步抽象可以這樣理解:左值應該可以作為一個地址空間用來存放一個值,而右值可以作為一個值來處理,當然需要說明的是有些是既可以作為左值也可以作為右值的,例如:定義a為一個指標指向b,那麼*a既可以作為一個右值即地址b中存放的資料,也可以作為一個左值即表示b的地址。其實說到這裡就已經說明了一個簡單的指標運算式了,那就是:*a。下邊就再討論一些其他的指標運算式。
首先做一個聲明:
char ch = “a”;
char *cp = &ch;
其實這個聲明很明了,這個聲明聲明了兩個變數:ch和cp,cp作為一個指標指向ch。為了便於隨後的說明,我現在做如下設想:cp變數地址為0x12,ch變數的地址為0x23,即現在空間cp中的內容為:0x23,ch中的內容為a字元。下邊做一些運算式的分析:
1、&ch:右值:表示ch的地址資訊,即0x23這個值。左值:它作為左值是非法的,因為它已經不可以作為一個空間來使用。
2、cp:右值;表示cp中的內容,即ch的地址資訊(0x23)。左值:表示cp這個地址空間,作為一個空間使用。
3、&cp:右值:表示cp的地址資訊,即0x12這個資料。左值:類比&ch也可知它作為左值是非法的。
4、*cp:這個和我們博文開始的例子是一樣的。右值:表示ch內的內容(a字元)。左值:表示ch這個地址空間。
5、*cp + 1:要注意*(我個人理解為間接範圍操作符)的優先順序高於+。右值:運算過程為:首先做間接的訪問操作得到a字元的一個拷貝,再加1,得到字元b。左值:位置未清晰定義,是非法的。
6、*(cp + 1):這個運算式可以把cp+1看做一個整體,它作為指標加法運算的結果是一個右值,表示ch的下一個地址,*(cp+1)做右值表示對ch下一個地址中的資料內容,做左值表示ch下一個地址這個空間(注意:cp+1本身不是左值)。
7、++cp與cp++:該運算式涉及++運算子,兩個運算式除了都有cp+1的功能外,兩個運算式整體的結果也都會得到變數的拷貝,但是首碼++會先執行加1的操作再獲得變數拷貝,而尾碼++則是先進行變數的拷貝再執行加1操作。因此++cp運算式作為右值執行後cp和++cp都會指向cp後面的記憶體位置,而cp++作為右值執行後cp會指向cp記憶體後面的記憶體位置,而cp++整體則是指向cp原來的記憶體位置(0x12)。他們都沒有清晰的位置定義,所以都是不合法的左值。
8、*++cp與*cp++:對比上邊兩個運算式這兩個理解起來也很容易了,只是進行了一次指標運算即間接訪問操作,對於右值來看,這兩個運算式結果只是對上邊兩個操作結果的間接訪問,即對應空間內的資料;對於左值來看,這回就是合法的了,對應的就是響應地址的地址資訊了。
綜合:其實關於指標的運算式還有很多,不同運算子之間的相應組合都會形成相應操作符,只要根據相應的運算子的優先順序一步步運算都可以得到其相應結果。敘述了這麼多的運算式,但是在實際運用中大多數還是一般的運算式,之所以把他們都整理一下是因為:1、有助於我們去理解別人的代碼,因為別人很可能會寫出這些運算式。2、有個別時候是用得到的,學習也是有必要的。3、總結這麼多最終目的並不是要簡單的去理解現有的運算式,而是通過現有的運算式的整理和理解,充分理解指標以及指標運算式的真正含義,深入的理解指標這個東西,有助於後期的學習和提高。
C語言提高之——指標運算式