C語言指標自增自減運算,c語言中指標可不可以用在自增自減運算子中

2022-12-24 06:11:18 字數 5367 閱讀 1260

1樓:

printf("%d,",*p); //指向陣列首地址

printf("%d,",*(++p));//地址先加1然後取值,也就是a[1]

printf("%d,",*++p);//取地址p加1後的值,就是a[2]

printf("%d,",*(p--));//先取p得值,然後再地址減1,最後p指向a[1]

printf("%d,",*p++);//先取p的值,然後p指標加1

printf("%d,",*p);//直接取p的值

printf("%d,",++(*p));//地址先加1,然後取值,也就是a[3]

printf("%d,",*p);//取a[3]

2樓:黃邦勇帥哥哥

你首先要明白,指標運算子的作用,我用一言以概之,你在**使用都不會錯。指標運算子*的作用是求出*後面所指地址裡的值。因此只要*後面的變數表示的是一個地址就可以使用*運算子,來求出這個地址中的值,你不用管這個地址的表示形式是怎樣的,只要是地址就可以使用*來求出地址中的值。

懂了原理之後,自已計算,太累了。

c語言中指標可不可以用在自增自減運算子中

3樓:風若遠去何人留

可以使用。

對於type *型別的p,可以使用p++或p--來實現p移動位置,指向下一個或上一個元素的效果。

在c語言中,指標的本質為地址,所以當type*型別的指標在進行++或--運算時,其指向的地址值,會實際增加或減少type所佔記憶體的大小。也就是說,從數值上,當p++時,值會增加sizeof(type), 當p--時,值會減少sizeof(type)。

4樓:

普通指標可以進行++、--運算,常指標不行,指向函式的指標也不行。如有:int a[10],*p=a;,則p++、++p、p--、--p都是合法的,而a++、++a、a--、--a不行,因為a是陣列名,是常指標;被const修飾的常指標也不能進行++、--運算,如有int x,*const q=&x;,則q也不能再指向別處,q++、++q、q--、--q都是非法的。

指向函式的指標進行++、--操作是沒有意義的,因為函式大小不一,一般也不是連續存放,所以對指向函式的指標作++、--操作也是非法的……

5樓:米嵐

可以,++按指標所指型別的大小後移一位,--前移。比如p指標指向當前地址為2000,指標p指向的資料型別大小100,p++則指向2100位置

6樓:匿名使用者

可以,指標也是變數,可以運算 ,(*p)++ 指標p指向的變數加一, *(p++) 指標變數加1後指向的另一個數

7樓:記住一座城

陣列名和結構體名不可以。

c語言的自增自減問題

8樓:勿忘心安

計算:從右往左,並輸出到「緩衝區」。

1、緩衝區是一堆疊

2、第一步:處理後面的「i--」。8進入緩衝區,i=7。緩衝區:8 <-(指標)

第二步:處理「i++」。7進入緩衝區,i=8。

緩衝區:7 8<-第三步:處理」--i「。

8進入緩衝區,i=7.緩衝區:8 7 8第四步:

處理「++i」  先自增1,然後8進入緩衝區,i=8 .緩衝區: 8 8 7 8

3、輸出緩衝區資料(棧規則):8 8 7 8另外自增 、自減 、還可能和編譯器有關係 。

9樓:匿名使用者

函式引數的求值順序是自右向左」更是大錯特錯。樓主,c語言跟大多數語言一樣,沒有規定表示式的求值順序,除了以下幾個順序點:

;(分號,標誌一條語句結束)

,(逗號操作符,函式引數列表裡面的逗號只起分隔作用,不是逗號操作符)

&&和||(邏輯與,邏輯或)

? : (條件運算子)

()(if,while,for, do..while,以及函式呼叫)

這些統稱為順序點,它們的求值順序有規定。我這裡只給你說明逗號操作符,其他的不一一作介紹(不然能寫一大篇呢),你自己參考相關資料。

逗號表示式最簡單的情形如下:

exp1, exp2;

c語言保證exp1在exp2之前求值,並且exp1求值的***保證在逗號之前生成。所以象下面這個逗號表示式:

int i = 1;

i++, (i == 2);

最後的值就是1,因為逗號表示式的前半部分i++的***(i自增1)在逗號之前已經生成,所以當執行到(i == 2)的時候,i的值已經是2了,所以i == 2成立,(i == 2)的值便作為整個逗號表示式的值。

但是,對函式原型,函式定義,函式呼叫,c語言裡面明確說明,引數列表裡面的逗號不是逗號操作符,只起到分隔作用,所以這裡的逗號不再是一個順序點,那它前後的表示式的求值順序就是任意的,並且所有帶***的表示式的***都要等到下一個順序點之後才是確定的,也就是說你只有等到下一個順序點之後,你才能準確得依賴這些表示式產生的***。

所以,像這樣的函式呼叫

foo(i++, ++i);是得不到準確的結果的。因為這裡逗號不是逗號操作符,所以就算編譯器選擇的是從左到右的求值順序,由於c語言不再保證i++的***在逗號之前生成,算到++i的時候,都不確定i到底有沒有自增1,不確定性就在這裡產生了。再者,如果編譯器選擇的是從右到左求值,同樣產生不確定性,這樣一來,傳進函式foo的兩個引數的值就可能不同,那麼最後的結果當然也就不同了。

你這裡一樣,printf是一個函式,

printf("%d,%d,%d\n",++i,--i,-i++);

是函式呼叫,括號內的所有逗號都不是逗號操作符,而只起到分隔引數的作用。所以++i,--i,-i++這三個表示式的求值順序是任意的,編譯器想怎麼算就怎麼算,不同的編譯器的「想法」可能相同可能不同,結果就可能一樣可能不一樣。這才是樓上的各位得到不同結果的真正原因!!!

樓主要好好參考順序點的定義和作用,並且牢記下面這條規則:

c語言裡面明確指出:在兩個順序點之間兩次改變同一個變數的任何嘗試得到的結果都是不確定的!

你這裡int i=10;

printf("%d,%d,%d\n",++i,--i,-i++);

的兩個順序點分別是int i=10;的分號,和包圍printf的引數的括號,c語言只保證位於兩個順序點之間的表示式求值產生***在第二個順序點之前生成,但不保證兩個順序點之間所有表示式的求值順序。你這裡++i,--i,-i++三個表示式企圖在兩個順序點前一個分號和()之間三次改變同一個變數i的值,所以結果註定是不確定的。至於為什麼c語言要規定相鄰順序點之間的表示式以任意順序求值,是為了給編譯器更多的自由空間,讓底層運算操作能由編譯器排程安排從而使運算更有效地執行。

另外,站長團上有產品**,便宜***

10樓:小云小冉

這裡首先說一句,你這種用法應該是不合法的,至少是很不可取的。因為像+、-、*、/這類算術運算子c語言並未規定運算元的求值順序,在不同的編譯器上,有可能先求做運算元,也有可能先求右運算元。所以建議不要採用這種不確定的式子。

你這裡是先求左運算元,也就是先求++n表示式的值,因為是字首自增,表示式(左運算元)值為6,此時n也變為6.然後求右運算元值,即表示式n++;的值,因為是字尾自增,所以表示式的值是6,因此第二運算元的值是6,因此結果是36.之後n變為7.

11樓:釗悟泥迎波

123456789main( )

12樓:匿名使用者

scanf輸入6[x=6], x>5成立, 緊接著無條件執行x++[x=7], 由於前面條件滿足, printf輸出7

scanf輸入4[x=4], x>5不成立, 緊接著無條件執行x++[x=5], 由於前面條件不滿足, printf輸出5, 執行x--[x=4]

因此輸入6時得到輸出7; 輸入4時得到輸出5

13樓:已存在這個名字

輸入6的時候,滿足if語句,x+1,輸出7,程式結束;

輸入4的時候,不滿足if語句,x+1,輸出5,x-1,程式結束。

14樓:傻仔青蛙

++在前面表示先進行變數自增,再執行算式,所以m=++i,先執行++i,i變為9,再賦值給m;

++在後面表示先進行算式,再執行變數自增,所以n=j++,先執行n=j,n被賦值為10,再j自增為11

15樓:匿名使用者

++前,表示先自加,後運算。

後++,表示先運算,後自加。

.所以,m=++i;先執行自加,即i=i+1;得i=9;

再運算,m=i;得m=9;

n=j++;先運算,即n=j;得n=10;

再自加,即j=j+1;得j=11;

.結果就是:

i=9,j=11,m=9,n=10.

16樓:匿名使用者

有一個簡單的記憶方法,++在前,就是先自增,i在後,就是自增以後再給值;相反,i在前,就是先給出i的值,++在後,就是把值給出來以後再自增。

m=++i; i先自增,自增以後為9,然後把9給mn=j++; 先把j的值10給n,然後再自增,j變成了11所以得結果。

如果滿意請採納

17樓:看灰過來了

把自增或者自減表示式作為函式引數,本身就應該被避免的,因為不同的編譯系統,在計算的時候,方法並不統一。例如;

i=1;

c=fun(i,++i);

當從左向右計算,那就是c=fun(1,2);

要是從右向左計算,就是c=fun(2,2);

這類問題不必深究,而是應該在呼叫函式之前,將實參的值給它確定了,然後再作為實參去呼叫函式

18樓:唐博

第一段**:

++i是先增加i的值,然後使用。

p=f(i,++i); 是先執行++i,後進行函式呼叫。因為執行了++i以後,i的值已經變成了3,

所以相當於p=f(3,3);

你可以在函式f裡面把a和b的值列印出來,你會發現a和b都是3.

第二段**:

i++是先使用i的值,然後把i的值加1.

所以相當於先執行p=f(2,2);

執行之後,把i的值變成3.答案應該是0.

我懷疑你們老師的課件寫錯了,建議你去問問他。

19樓:windy笨笨狗

主要自增自減問題,方面你記憶,給個方法

x++表示式的值從左到右看x的位置,此時x在++左,還沒有++,故 x++表示式的值就是x值

相反++x,x在++右邊,表示式的值即x+1的值但是不管哪種,只要執行完了,x的值就+1

x--,--x一樣

故: 6時: if(6>5) ,輸出 74時: if(4>5)不滿足, 執行x--,但是此時x已經執行了一遍++,故x在--前為5

x--表示式的值 為5

希望對你有用,望採納

c語言中的自增運算

b 和 b的區別 b 首先返回b的值 然後b自增1 b首先b自增1,然後返回b的值 y a a a 執行順序如下 a a 1 a 1 y a y 1 y y a y 2 a a 1 a 2 y y a y 4 a a 1 a 3 a,先做自增,再使用a的值 a 先使用a的值,再做自增 y a a a...

C語言中,指標變數該如何使用呢,C語言中指標和指標變數的區別是什麼

int integer 0 為求來 地址運算子,指標用來儲存 源一些變數的bai地址 可以這樣訪du問 pinteger 得到 pinteger這個整形指標裡面的值 zhi0 建議看dao 相關的書,難懂的東西才有意義 所謂指標其實就是用來儲存地址的 就這樣想就好了 比如 int a,p p a 就...

C語言中指標與陣列有什麼關係,C語言中,指標和陣列的區別和聯絡

c語言中陣列和引數可以通用,陣列有一個基址,c中用指標指向它,計算陣列元素地址的時候,是基址 元素位元組數 元素序號 1 陣列名bai代表陣列在記憶體du中的首地址。指標可zhi以儲存一個地址dao,也即指向某地回址。在c中,答 對於某地址的訪問有兩種方式 1.直接訪問,如用變數名進行賦值等 2.間...