理解C:递增指针

理解C:递增指针,c,pointers,C,Pointers,我正在准备编程语言考试,我偶然发现了这个(用C写的): *tp++=*sp++ 我明白什么是*tp=*sp;可能会,但在这里,指针何时递增?获取值之前、之后?按什么顺序?我很感谢您的回答指针地址相等后,它们将递增。如果您不想这样做,您应该使用++*tp和++*sp 指针地址彼此相等后,它们将递增。如果您不想这样做,您应该使用++*tp和++*sp ++是后增量运算符,因为它们立即出现在指针之后(而不是之前);两个指针在分配(取消引用的地址)后递增 这相当于: *tp = *sp; tp++; s

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

*tp++=*sp++


我明白什么是
*tp=*sp
;可能会,但在这里,指针何时递增?获取值之前、之后?按什么顺序?我很感谢您的回答

指针地址相等后,它们将递增。如果您不想这样做,您应该使用
++*tp
++*sp

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

++
是后增量运算符,因为它们立即出现在指针之后(而不是之前);两个指针在分配(取消引用的地址)后递增

这相当于:

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

++
是后增量运算符,因为它们立即出现在指针之后(而不是之前);两个指针在分配(取消引用的地址)后递增

这相当于:

*tp = *sp;
tp++;
sp++;
相当于

*tp = *sp;
tp++;
sp++;
因此,它将
sp
指向的值复制到
tp
指向的位置,然后递增两个指针

相当于

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

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

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

如果表达式为

*(++tp) = *(++sp)
然后,指针将在求值之前递增


这些构造通常出现在循环内部。

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

如果表达式为

*(++tp) = *(++sp)
然后,指针将在求值之前递增

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

*tp++ = *sp++;
有四件事发生了:

  • 增量
    tp
  • 增量
    sp
  • 在增量之前获取sp处的值
  • 在增量之前在tp处赋值
只要结果正确,任何订单都有效(仅取决于QOI)

  • *tp=*sp;tp++;sp++
  • savedtp\u寄存器=tp;tp++*savedtp_寄存器=*sp;sp++
  • savedsp\u寄存器=*sp;sp++*tp=保存DSP_寄存器;tp++
    • 有四件事发生了:

      • 增量
        tp
      • 增量
        sp
      • 在增量之前获取sp处的值
      • 在增量之前在tp处赋值
      只要结果正确,任何订单都有效(仅取决于QOI)

      • *tp=*sp;tp++;sp++
      • savedtp\u寄存器=tp;tp++*savedtp_寄存器=*sp;sp++
      • savedsp\u寄存器=*sp;sp++*tp=保存DSP_寄存器;tp++

      你应该小心不要相信“之后”这个词。诚然,在本例中,行为就像指针在赋值后递增一样,但只要结果相同,C编译器没有义务按照该顺序实际执行操作

      具体而言,有以下步骤:

    • 获取sp的值(称为sp0)
    • 获取tp的值(称之为tp0)
    • 计算sp0+1(称为sp1)
    • 计算tp0+1(称之为tp1)
    • 将sp1存储在sp
    • 将tp1存储在tp
    • 使用sp0获取值(称为v)
    • 使用tp0存储v
    • 顺序上唯一的约束是显而易见的,即值必须在使用之前可用。您不知道,也不应该试图猜测编译器将选择什么顺序。另一方面,分号(语句终止符)是一个“序列点”,告诉编译器不允许对其上的效果重新排序——除非它能证明它不会改变结果(例如,可能会更快)


      如果您尝试在同一语句中多次使用同一指针变量,则这些都是最相关的,但即使在您的示例中,如果指针恰好指向自身,也会产生不同的效果。

      您应该小心相信“after”一词。诚然,在本例中,行为就像指针在赋值后递增一样,但只要结果相同,C编译器没有义务按照该顺序实际执行操作

      具体而言,有以下步骤:

    • 获取sp的值(称为sp0)
    • 获取tp的值(称之为tp0)
    • 计算sp0+1(称为sp1)
    • 计算tp0+1(称之为tp1)
    • 将sp1存储在sp
    • 将tp1存储在tp
    • 使用sp0获取值(称为v)
    • 使用tp0存储v
    • 顺序上唯一的约束是显而易见的,即值必须在使用之前可用。您不知道,也不应该试图猜测编译器将选择什么顺序。另一方面,分号(语句终止符)是一个“序列点”,告诉编译器不允许对其上的效果重新排序——除非它能证明它不会改变结果(例如,可能会更快)

      如果您尝试在同一语句中多次使用同一指针变量,那么这些都是最相关的,但是