理解C:增加指针

时间:2011-05-28 12:11:51

标签: c pointers

我正在攻读编程语言的考试,我偶然发现了这个问题(用C语言编写):

*tp++ = *sp++;

我理解*tp = *sp;可能会这样做,但在这里,指针何时递增?之前,在获取值之后?按什么顺序?我很感激你的回答

6 个答案:

答案 0 :(得分:7)

由于++运算符位于变量之后,因此在计算表达式后,值将递增。因此,这会将sp当前指向的值分配给tp当前指向的位置,然后递增两个指针。

如果表达式是

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

然后指针会在评估之前递增。

这些结构通常出现在循环中。

答案 1 :(得分:3)

*tp++ = *sp++;

相当于

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

所以它将sp指向的值复制到tp指向的位置,然后递增两个指针。

答案 2 :(得分:3)

你应该小心相信'之后'这个词。确实,在这个示例中,行为就好像指针在赋值后递增一样,但是C编译器没有义务按顺序执行操作,只要结果相同。

具体来说,有以下步骤:

  1. 获取sp的值(将其命名为sp0)
  2. 获取tp的值(称之为tp0)
  3. 计算sp0 + 1(称之为sp1)
  4. 计算tp0 + 1(称之为tp1)
  5. 将sp1存储在sp
  6. 将tp1存储在tp
  7. 使用sp0获取值(称之为v)
  8. 使用tp0存储v
  9. 对订单的唯一限制是显而易见的,即值必须在使用之前可用。您无法知道,也不应该猜测,编译器会选择什么顺序。另一方面,分号(语句终止符)是一个'序列点',告诉编译器它不允许对它进行重新排序 - 除非它能证明它不会改变结果(但可能更快,例如)。

    如果你试图在同一个语句中多次使用相同的指针变量,那么这一切都是最重要的,但即使在你的例子中,如果你的指针碰巧指向自己,它也会有所不同。

答案 3 :(得分:1)

++是后增量运算符,因为它们会立即出现在指针之后(而不是之前);两个指针在赋值后(递归引用的地址)递增。

相当于:

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

答案 4 :(得分:1)

*tp++ = *sp++;

有四件事情可以解决:

  • 增量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++;
  • ...

答案 5 :(得分:-1)

在指针地址彼此相等之后,它们会递增。如果您不想这样,则应使用++*tp++*sp