C語言中指標的自增運算總結

2021-07-02 06:05:48 字數 1488 閱讀 7609

**如下:

#includeint main()

程式執行結果為:
a=1,*p=1

a=2,*p=2

c=2,*p=-858993460

d=1638272,*p=1638272

請按任意鍵繼續.

程式中(*p)++等價於a++,

c=*p++等價於,

d=*++p等價於

d=*(++p)和

由於編譯程式為變數分配的位址不連續,所以d的值會出現上述結果。為了分析指標中的自增運算,假設定義變數時記憶體分配的位址空間連續,且位址在增加,a的為1010
b的為1012,c的為1014,d的為1016,

則結果會變為

a=1,*p=1

a=2,*p=2

c=2,*p=4

d=2,*p=2

說明:
指標運算子*和自增運算子++的優先順序都是2,結合方向都是自右向左。

把指標運算子*,自增運算子++和圓括號與乙個指標變數p搭配,可以都得到以下運算組合:(假定之前有p=&a;)

1、*p++

2、*p(++)

3、(*p)++

4、*++p

5、*(++p)

6、++*p

7、++(*p)

分析結果:

1、*p++,p先跟*結合了,得到p指向的變數的值,即(*p),然後p再跟++結合,使指標p指向記憶體中下乙個位置。結果改變不能立即看出。

2、*p(++),雖然有優先順序更高的圓括號()把++括起來,但就算要先計算括號裡面的東西,光有乙個++,什麼也做不了。沒辦法,只能讓p先跟*結合,再跟++結合。這就跟第1種組合一樣。

3、(*p)++,由於優先順序,圓括號裡面的先計算,所以先取*p,再使(*p)自增1,而不是使指標p指向記憶體中下乙個位置。結果改變不能立即看出。

4、*++p,由於結合性,這種寫法體現了++和*自右向左的結合方向,先使指標p指向記憶體中下乙個位置,再取*p。結果改變可以立即看出。

5、*(++p),同第4種組合。

6、++*p,由於結合性,這種寫法體現了++和*自右向左的結合方向,先使*p自增1,再取*p。結果改變可以立即看出。

7、++(*p),同第6種組合。

總結一下:

*p++等價於*p(++),取值,移位(不安全)。

(*p)++,取值,增值。

*++p等價於*(++p),移位,取值(不安全)。

++*p等價於++(*p),增值,取值。

C語言中自增運算子的解析

關於c語言中a a這種自增運算的討論其實很無聊,但是有時候為了應付面試,還不得不細細 一下。環境 win7,vs2010 例題 寫出判斷abcd四個表示式的是否正確,若正確,寫出經過表示式中 a的值 3分 int a 4 a a a b a a c a a d a a 問 a 答 c錯誤,左側不是乙...

C語言 自增( ) 自減( )運算

1.作用 自增運算使單個變數的值增 自減運算使單個變數的值減 2.用法與運算規則 自增 自減運算子都有兩種用法 1 前置運算 運算子放在變數之前 變數 變數 先使變數的值增 或減 然後再以變化後的值參與其它運算,即先增減 後運算。2 後置運算 運算子放在變數之後 變數 變數 變數先參與其它運算,然後...

C語言中指標大全

1.使用二維字串儲存字串的時候會出現儲存浪費的情況,使用指標陣列儲存則不會 char s for i 0 ifor i 0 i 3 i 2.指標陣列作為函式引數傳遞多個字串給另乙個函式。指標陣列是乙個陣列,只是裡面存放了指標 void str sort char s,int n n代表指標陣列的長度...