2011-05-28 150 views
1

我學爲我的編程語言考試,我在無意中發現這個(用C語言編寫):理解C:遞增指針

*tp++ = *sp++;

我明白了什麼*tp = *sp;可能會做,但在這裏,指針何時增加?之前,值提取後?按什麼順序?我很感謝你的回答

+1

這是一個後增量操作符,因此它會提取該值,然後遞增指針地址 – 2011-05-28 12:15:30

回答

7

由於++操作符位於變量之後,因此值將在計算表達式後遞增。因此,這會將當前由sp指向的值分配給當前由tp指向的位置,然後增加兩個指針。

如果表達式代替

*(++tp) = *(++sp) 

然後,指針將評估之前遞增。

這些結構通常發生在循環內部。

+0

+1。很好的解釋。 – 2011-05-28 12:19:14

-1

它們在指針地址相等後遞增。如果你不想這樣做,你應該使用++*tp++*sp

+0

,該值不會做您認爲的操作! – 2011-05-28 12:16:16

+1

是的,++ * tp遞增了tp指向的值,而不是tp本身。此外,原始表達式與指針的地址*是否相等無關。 – 2011-05-28 12:17:24

1

++是後增加操作符,因爲它們立即出現在指針之後(而不是緊接在之前);兩個指針在賦值之後(取消引用的地址)遞增。

它等同於:

*tp = *sp; 
tp++; 
sp++; 
3
*tp++ = *sp++; 

相當於

*tp = *sp; 
tp++; 
sp++; 

所以它複製的價值指向sp的位置指向tp再增加兩個指針。

+0

+1。從我....... – 2011-05-28 12:25:49

1

*tp++ = *sp++; 

有四件事情hapenning:

  • 增量tp
  • 增量sp
  • 增量
  • 之前在SP獲取的價值在TP分配該值前增量

只要結果是正確的,任何順序是有效的(它只是取決於一種或多種QoI)

  • *tp = *sp; tp++; sp++;
  • savedtp_register = tp; tp++; *savedtp_register = *sp; sp++;
  • savedsp_register = *sp; sp++; *tp = savedsp_register; tp++;
  • ...
3

你應該小心相信'後'這個詞。確實,在這個的例子中,的行爲就好像指針在賦值之後遞增,但C編譯器沒有義務按照該順序實際執行任何操作,只要結果相同即可。

具體地,存在以下步驟:

  1. 取SP(稱之爲SP0)
  2. 取TP的值的值(稱之爲TP0)
  3. 計算SP0 + 1(呼叫它SP1)
  4. 計算TP0 + 1(稱之爲TP1)
  5. 商店SP1在SP
  6. 商店中1在TP
  7. 使用SP0獲取的值(稱之爲V)
  8. 使用TP0存儲v

訂單上的唯一的限制是明顯的,即正在使用前值必須是可用的。你不知道,也不應該猜測,編譯器會選擇什麼樣的順序。另一方面,分號(語句終結符)是一個「序列點」,它告訴編譯器不允許對它重新排序效果 - 除非它能證明它不會改變結果(但可能會更快,例如)。

如果您嘗試在同一個語句中多次使用相同的指針變量,那麼這些都是最相關的,但即使在您的示例中,如果您的指針碰巧指向自己,它也可能會有所不同。