理解C:递增指针
我正在准备编程语言考试,我偶然发现了这个(用C写的):理解C:递增指针,c,pointers,C,Pointers,我正在准备编程语言考试,我偶然发现了这个(用C写的): *tp++=*sp++ 我明白什么是*tp=*sp;可能会,但在这里,指针何时递增?获取值之前、之后?按什么顺序?我很感谢您的回答指针地址相等后,它们将递增。如果您不想这样做,您应该使用++*tp和++*sp 指针地址彼此相等后,它们将递增。如果您不想这样做,您应该使用++*tp和++*sp ++是后增量运算符,因为它们立即出现在指针之后(而不是之前);两个指针在分配(取消引用的地址)后递增 这相当于: *tp = *sp; tp++; s
*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处赋值
*tp=*sp;tp++;sp++代码>
savedtp\u寄存器=tp;tp++*savedtp_寄存器=*sp;sp++代码>
savedsp\u寄存器=*sp;sp++*tp=保存DSP_寄存器;tp++代码>
- 增量
tp
- 增量
sp
- 在增量之前获取sp处的值
- 在增量之前在tp处赋值
*tp=*sp;tp++;sp++代码>
savedtp\u寄存器=tp;tp++*savedtp_寄存器=*sp;sp++代码>
savedsp\u寄存器=*sp;sp++*tp=保存DSP_寄存器;tp++代码>
- 获取sp的值(称为sp0)
- 获取tp的值(称之为tp0)
- 计算sp0+1(称为sp1)
- 计算tp0+1(称之为tp1)
- 将sp1存储在sp
- 将tp1存储在tp
- 使用sp0获取值(称为v)
- 使用tp0存储v 顺序上唯一的约束是显而易见的,即值必须在使用之前可用。您不知道,也不应该试图猜测编译器将选择什么顺序。另一方面,分号(语句终止符)是一个“序列点”,告诉编译器不允许对其上的效果重新排序——除非它能证明它不会改变结果(例如,可能会更快)
- 获取sp的值(称为sp0)
- 获取tp的值(称之为tp0)
- 计算sp0+1(称为sp1)
- 计算tp0+1(称之为tp1)
- 将sp1存储在sp
- 将tp1存储在tp
- 使用sp0获取值(称为v)
- 使用tp0存储v 顺序上唯一的约束是显而易见的,即值必须在使用之前可用。您不知道,也不应该试图猜测编译器将选择什么顺序。另一方面,分号(语句终止符)是一个“序列点”,告诉编译器不允许对其上的效果重新排序——除非它能证明它不会改变结果(例如,可能会更快) 如果您尝试在同一语句中多次使用同一指针变量,那么这些都是最相关的,但是
- 在
有四件事发生了:
如果您尝试在同一语句中多次使用同一指针变量,则这些都是最相关的,但即使在您的示例中,如果指针恰好指向自身,也会产生不同的效果。您应该小心相信“after”一词。诚然,在本例中,行为就像指针在赋值后递增一样,但只要结果相同,C编译器没有义务按照该顺序实际执行操作 具体而言,有以下步骤: