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歲,在比賽過程中揮灑汗水和淚水,但他從未放棄。不管他生活怎麼對待他,他總是勇敢地反抗,湖北省乙個大二學生吳春燕這麼說道。他從來沒有放棄作乙個歌手的夢想。在成名的道路充滿了坎坷和艱辛,張也不...