程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> C語言提高之——指針表達式

C語言提高之——指針表達式

編輯: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、總結這麼多最終目的並不是要簡單的去理解現有的表達式,而是通過現有的表達式的整理和理解,充分理解指針以及指針表達式的真正含義,深入的理解指針這個東西,有助於後期的學習和提高。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved