看一下下面的程式,我不懂p為何等於5,然後能不能說一下p 和 p的區別

時間 2021-08-11 17:26:16

1樓:primo王的悲傷

一個陣列的陣列名,就是他的首地址了。這裡,a的地址其實就是a[0]的地址,所以 p = a;和 p = &a[0]是一樣的。接下來 陣列都是連續分配的記憶體所以,a[1] 就等於a[0]的地址加一。

首先 p是指標,他指向了a的首地址,那麼*p的意思就是解地址,取出地址裡面的東西。

然後 就是 ++ 符號, ++符號放在前面就是先++再運算,但是放在後面就是先運算再++;

最後 *p和*(p++),*p是解析p裡面的東西,而*(p++)就是地址++之後解析出來的東西

然後進入第一個printf,這裡是*p++,就是一個解地址 一個 ++;因為++是放在後免,所以先運算得到 *p ,也就是a是等於1的。好這裡就列印了第一個1;

然後在++;

這裡p就指向了3.然後 第二個*(++p);++放在前面,先++;這樣p就指向了5

,然後* 解析出來。列印5;就完了。

還有陣列 a 你也可以直接寫*(a + 0); a 就是 *(a+1);

還有不懂的嗎?

2樓:匿名使用者

分別把前後的值列印出來,就知道區別了

~~~~~~

(*p)++和*(p++)和*p++的區別,為什麼?

3樓:匿名使用者

*(p++):取出指標p所指

地址中的資料,指標+1

*p++        :  等同於 *(p++)

(*p)++  : 取出指標p所指地址中的資料,地址中的資料+1

tip1.  * 與 ++的優先順序相同的,它們的結合性都是自右向左

tip2.  ()的優先順序高於*和++

優先順序、結合性分析:

*p++      由(tip1)可知,p先與++結合,再與*結合,

*(p++)     由(tip2)可知,p先與++結合,再與*結合

得出結論:*p++等同於 *(p++)

變數分析:

*(p++)      由(tip2)可知,是p先與++結合,變數是  p,

得出結論:*(p++)      // 是指標所指的地址值在變化            (不同點)

(*p)++       由(tip2)可知,p先與*結合,得到*p

是*p與++結合,變數是  *p

得出結論:(*p)++    //是指標所指地址中的資料值在變化   (不同點)

小結:因為(tip1、tip2)可得出:

1.指標所指地址自增

*p++等同於*(p++)

*++p等同於*(++p)

2.指標所指地址中資料自增

++(*p)等同於++*p

(*p)++

作為輸出項時

(左自增:先求變數變化,再輸出)

形式:++p、*++p、++*p、++(*p)、

(右自增:先輸出變數當前所指值,再求變數的變化)

形式:p++、*p++、(*p)++、*(p++)

哪個是變數:(在tip1、tip2的基礎上)與 ++  結合的整體是變數

++p        :  p   是變數、

++(*p):    (*p)是變數

4樓:稀飯

字首遞增遞減和*優先順序相同,從右到左;

字尾遞增遞減比字首優先順序高,從左到右。

比如int arr[5] = ;

int *p = arr;

*++p:p先自+,然後*p,最終為3

++*p:先*p,即arr[0]=1,然後再++,最終為2*p++:值為arr[0],即1,該語句執行完畢後,p指向arr[1]

(*p)++:先*p,即arr[0]=1,然後1++,該語句執行完畢後arr[0] =2

*(p++):效果等同於*p++

5樓:蘭之春春

(*p)++,是先取指標p的值,然後對其值進行++運算,

*(p++),是先對指標p進行++運算,然後再取取值,

*p++,同*(p++),因為按優先順序來看,*和++是同級,他們都是從右到左的順序進行運算,所以先++,再*。

如果char q[5] = "am";

char *p = q;

那麼,(*p)++後,p就變成了"bm";因為是進行對其首元素進行加1運算

*(p++)後,p就變成了"m",因為是先指向下一個元素,再進行取值運算,

*p++同上面,

如果只是徵對這3個語句賦值給其他變數的話,3個的結果都是a,在這裡。

char o = (*p)++;

char m = *(p++);

char n = *p++;

都是a。

6樓:匿名使用者

int arr[2]=;

int *p=&arr[0];

(*p)++ // 等價於arr[0]++ p不變 既p所指向的內容增1

*(p++) //等價於 arr[0] p=&arr[1], 獲取p所指向的內容後 p指標增加1

*p++ 和*(p++) 一樣, 由於 ++操作優先於*

7樓:匿名使用者

樓主可以去看看c語言優先順序有關的知識。首先*p++等價於*(p++)。至於為什麼會等價呢?

根據c語言的優先順序。*與++的優先順序同處在第二級別上。他們的優先順序是一樣的,又因為處在第二級別的優先順序運算子是結合方向是從右到左,所以當出現*p++這樣的表示式的時候,根據優先順序別相同,並且結合方向是從右到左,所以就等價於*(p++)了。

那麼也就是,先將p指標移動到下個p指標所指向元素的地址的下一個地址,然後再對那個地址取值。(*p)++是取p所指向地址的值,然後再將這個值+1.這裡舉個例子,比如

int a[2]=;

int *p=a;

*p++//的結果就是等於陣列的第二個元素10.

(*p)++//的結果就是1+1=2.

樓主,我這樣解釋,把意思講明白了麼?

8樓:啊啊阿橙

自己跑個程式就知道了

9樓:白石黃海青

第一個,p所指的那個值加1。第二個,假設p指向a[1],則使用時用a[1],但p已指向a[2],假設a[2] 存在。第三個,和第二個一樣的解釋,因為++的優先順序別高於*的,那個括號有沒有都一樣

10樓:匿名使用者

首先p指的是指標,這你一定知道, *p++相當於(*p)++ 也就是平所指的值自加一,

*(p++)相當與p的地址加一個單位,具體加多少要看p的型別了,詳細不說了。就是p的下一個地址的值。 這就是區別。

11樓:匿名使用者

首先,明確:++的優先順序高於*的優先順序。

(*p)++

//首先取p所指向的值,給它所指向的值做字尾加,由於是字尾加,所以返回原來表示式的值,即該表示式最後的值為p所指向的值

*p++

//它相當於*(p++),首先指標p後移,由於對指標是字尾加,所以p++返回p沒後移時的指標,如果是陣列,那麼表示式的值為指標當前所指元素(指標沒有後移時)的值

++*p

//即相當於++(*p),先取p所指向的值,然後施以字首加,則該表示式的值為p當前所指物件的值+1的結果。

*++p

//相當於*(++p),指標p先後移,如果是陣列,則指向下一個元素,然後++p返回指標下移後的指標。然後*取下移指標後所指向的值

12樓:

()的優先順序高,所以()裡面的先執行。另外++的優先順序高於*。

(*p)++中,是p所指的東西++

*(p++)中,是p的地址++。*p++與*(p++)一樣的。

13樓:匿名使用者

他這個這個這個。產人一廠一

請教c語言中(*p)++與*p++與++*p與*++p的區別

14樓:井鈺

首先,明確:++的優先順序高於*的優先順序。

(*p)++

//首先取p所指向的值,給它所指向的值做字尾加,由於是字尾加,所以返回原來表示式的值,即該表示式最後的值為p所指向的值

*p++

//它相當於*(p++),首先指標p後移,由於對指標是字尾加,所以p++返回p沒後移時的指標,如果是陣列,那麼表示式的值為指標當前所指元素(指標沒有後移時)的值

++*p

//即相當於++(*p),先取p所指向的值,然後施以字首加,則該表示式的值為p當前所指物件的值+1的結果。

*++p

//相當於*(++p),指標p先後移,如果是陣列,則指向下一個元素,然後++p返回指標下移後的指標。然後*取下移指標後所指向的值

關於c語言指標變數*p++ 、*(p++)、(*p)++的區別

15樓:匿名使用者

1. printf中表示式的計算是右結合的,即從右向左運算;但輸出還是從左向右

2. 第一個回printf,先取q所是單元的值顯示,即答為2,再對q++,即q所指單元地址後移一個單元,這裡無意義;然後再對p指單元后自增,先輸出2。“*”運算子的優先順序高於“++”運算子。

3. 第二個printf,都是對p和q所指單元的值進行操作,(*q)++先輸出a的值2,再將其值加1變為3;再將p所指單元的內容a的值輸出3

16樓:匿名使用者

首先搞明白一點來,printf語句中表源達式的執行順序是bai

從右向左的,並du且對於zhi*(q++),首先進行dao解引用操作,再自增,即*q, q=q+1;所以說第一個printf的輸出為2 2

對於第二個printf,首先執行(*q)++,再執行*p++,對於(*q)++可以轉化為先執行(*q),即輸出它的值,再執行(*q)=(*q)+1,最後輸出*p,所以結果為3 2

17樓:匿名使用者

*p++ 由於++和*同優級,是自右向左的結合方向*(p++),因此等價於*(p++);他們的作用是得到p指向的變數值(*p),然後p +1=》p

(*q)++,是先取p指向的變數值,然後其值再加一;

18樓:樂酷科技

*p++就等於*(p++) p自加 先算出當前地址的值*p 然後指向下個地址

(*p)++是取出地址裡的值 這個值自加 p還是指向原來的地址

19樓:窗櫺間的月光

對於第二條printf語句的列印結果我表示懷疑,我覺得答案應該還是 2 2,而不應該是3 2

c語言中*p++和*(p++)有什麼不同 ?

20樓:問明

區別:1、*p++與*(p++)是等價的,表示取p所指單元的值,p指向下一單元,即p自加1。

3、(*p)++是指將*p所指的資料的值加一。

c編譯器認為*和++是同優先順序操作符,且都是從右至左結合的,所以*p++中的++只作用在p上,和*(p++)意思一樣;在(*p)++中,由於()的優先順序比*和++都高,所以++作用在()內的表示式*p上。

比如有:

int x,y,a=,*p=a,*q=a;

x=*p++;//執行這一句後x=a[0]=1,p=a+1

y=(*q)++;//執行這一句後,y=a[0]+1=2,q仍然=a

驗證程式1

#include"stdio.h"

void main()

int a=2;

int*p=&a;

int*pold;//記錄p指向的地址,為了作為比較使用

pold=p;

//-----------原來的資訊

printf("原來的a=%d",a);

printf("原來的p=%x",p);

printf("原來的pold=%x",pold);

//----------進行變化

printf("*p++的結果=%d,a的結果a=%d",*p++,a);

printf("地址變化的結果p-pold=%x",p-pold);

程式2#include"stdio.h"

void main()

int a=2;

int*p=&a;

int*pold;//記錄p指向的地址,為了作為比較使用

pold=p;

//-----------原來的資訊

printf("原來的a=%d",a);

printf("原來的p=%x",p);

printf("原來的pold=%x",pold);

//----------進行變化

printf("(*p)++的結果=%d,a的結果a=%d",(*p)++,a);

printf("a的結果a=%d",a);

printf("地址變化的結果p-pold=%x",p-pold);

執行結果

程式3#include"stdio.h"

void main()

int a=2;

int*p=&a;

int*pold;//記錄p指向的地址,為了作為比較使用

pold=p;

//-----------原來的資訊

printf("原來的a=%d",a);

printf("原來的p=%x",p);

printf("原來的pold=%x",pold);

//----------進行變化

printf("a=%d,(*p)++的結果=%d,a的結果a=%d",a,(*p)++,a);

printf("a的結果a=%d",a);

printf("地址變化的結果p-pold=%x",p-pold);

程式4#include"stdio.h"

void main()

int a=2;

int*p=&a;

int*pold;//記錄p指向的地址,為了作為比較使用

pold=p;

//-----------原來的資訊

printf("原來的a=%d",a);

printf("原來的p=%x",p);

printf("原來的pold=%x",pold);

//----------進行變化

printf("*(p++)的結果=%d,a的結果a=%d",*(p++),a);

printf("a的結果a=%d",a);

printf("地址變化的結果p-pold=%x",p-pold);

程式5#include"stdio.h"

void main()

int a=2,*p=&a,*q=&a;

printf("%d%d",(*p),a);

printf("%d%d%d",*p++,(*p)++,*q++);

printf("%d",a);

程式6#include"stdio.h"

void main()

int a=2,*p=&a,*q=&a;

printf("%d%d",(*p),a);

printf("%d%d%d",(*p)++,*p++,*q++);

printf("%d",a);

程式7:

#include"stdio.h"

void main()

int a=2,*p=&a,*q=&a;

printf("%d%d",(*p),a);

printf("%d%d%d%d",(*p)++,*p++,*q++,a);

printf("%d",a);

程式8:

#include"stdio.h"

void main()

int a=2,*p=&a,*q=&a;

printf("%d%d",(*p),a);

printf("%d%d%d",*p++,(*p)++,*q++);

p=&a;q=&a;

printf("%d%d%d%d",a,*p,(*q)++,a);

printf("%d%d%d%d",a,++(*p),++(*q),a);

printf("%d",a);

綜上所述:

*p++是先取出*p的值,然後讓p++

(*p)++是先取出*p的值,讓這個值++

*(p++)是先取出*p的值,讓p++

所以,*p++等價於*(p++)

而且printf的執行順序是從右向左執行。而且右++是在整個運算表示式運算完才進行,而且右++的執行順序是從左到右進行。而左++遇到變數就會立即增加變數的值。

驗證printf的運算順序

#include"stdio.h"

void main()

int a=2;

printf("a++=%d,++a=%d,a++=%d",a++,++a,a++);

printf("a=%d",a);

翻譯一下下面的一段,誰可以給我翻譯一下下面的一段話啊,謝謝了。

edan cookie,一個因紐特女孩 你好!我的名字叫做edan cookie。我今年十歲,我住在umiujaq,加拿大努納威克一個小村莊。我有一個姐妹和兄弟。我的母親是一位警察。我最喜歡的食物是魚和披薩。我最喜歡的動物是北極熊和貓。我們村有大約300人。1985年,第一個家庭來到這個小村莊定居。...

請翻譯一下下面的英文

首先說明一下,我用的是意譯而已 確實,在過去的兩年裡,布宜諾斯艾利斯 buenos aires的名字 首都的周邊地區綁架 或者誘拐 劫持 的案件增加四倍。憤怒的阿根廷人又上街遊行要求改變這種狀況,這大大的多虧乙個在這件事裡成為抵抗英雄的男人的力量。隨便翻譯,意思大概是這樣。nowhere is th...

翻譯一下下面的英語啦

1全部他止步於快男四強。但是,這並沒有阻止他捕捉數萬名球迷的心。他可以輕鬆長出高音。而且他非常謙虛的。張杰,26歲,在比賽過程中揮灑汗水和淚水,但他從未放棄。不管他生活怎麼對待他,他總是勇敢地反抗,湖北省乙個大二學生吳春燕這麼說道。他從來沒有放棄作乙個歌手的夢想。在成名的道路充滿了坎坷和艱辛,張也不...