C – 具有前后增量的指针行为
在我做C指针的一些实验,并试图了解它的行为。 以下是我对以下代码的假设。 如果我错了,请纠正我。 我有以下代码:
int n[5] = {3,6,9,12,15}; int *ptr = n; ptr++; printf("%d", *ptr); //Needless to say, the output will be 6
我的假设 :上面的输出是6,因为ptr++
表示ptr = ptr + 1
我正在改变ptr的值 ,它是n[0]
的地址 。
现在我们来看看以下场景:
int n[5] = {3,6,9,12,15}; int *ptr = n; *ptr++; printf("%d", *ptr); //Why is the output still 6?
我的问题是:我们如何解释*ptr++
? 这是否意味着:
- * ptr = * ptr + 1或
- * ptr = ptr + 1或
- ptr = ptr + 1还是什么?
顺便说一句,当我打印出n
值时,它仍然是3,6,9,12,15
。
对不起第二个问题 :
那么我们如何解释*++ptr
和++*ptr
呢?
表达
*ptr++;
有价值
*ptr
在递增ptr
之前,然后ptr
自行递增。 写作是没有意义的
*ptr++;
因为没有使用在递增*ptr
之前为*ptr
的表达式的值。 所以实际上是这些表达式的结果(表达式语句)
ptr++;
和
*ptr++;
是一样的。
至于表达式*++ptr
和++*ptr
那么在这个表达式中* ++ ptr首先ptr递增(也就是说它将指向数组的第二个元素),然后取消引用它的值,它的值是第二个要素。 在这个表达式++*ptr
,首先返回数组的第一个元素的值(即3),然后这个值递增,你将得到4。
请检查以下链接: ++ * argv,* argv ++,*(argv ++)和*(++ argv)之间的区别
您需要了解运算符优先级才能了解此处发生的情况。
++
运算符优先于*
ptr ++和* ptr ++都返回指针,在第一种情况下,指向ptr指向的先前地址,在第二种情况下,指向该地址的值。 你没有对结果做任何事情,所以你没有看到差异。
* ++ ptr将首先递增ptr,然后返回它现在指向的值。
++ * ptr将获得ptr指向的值,递增它,然后返回。
这是由于C中的运算符优先级。以下链接可能对您有所帮助
递增或递减运算符具有更高的优先级,即取消引用运算符。所以你的
*ptr++; is similar to *(ptr++)
http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm
由于运算符优先级*pt++;
与*(ptr++);
所以它递增指针,然后取消引用指针,什么都不做。
优先顺序也取决于编译器。 它可能会根据编译器而改变。 最好使用括号来确保输出