2011-05-28 69 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

订单上的唯一的限制是明显的,即正在使用前值必须是可用的。你不知道,也不应该猜测,编译器会选择什么样的顺序。另一方面,分号(语句终结符)是一个“序列点”,它告诉编译器不允许对它重新排序效果 - 除非它能证明它不会改变结果(但可能会更快,例如)。

如果您尝试在同一个语句中多次使用相同的指针变量,那么这些都是最相关的,但即使在您的示例中,如果您的指针碰巧指向自己,它也可能会有所不同。