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++); 所以它递增指针,然后取消引用指针,什么都不做。

优先顺序也取决于编译器。 它可能会根据编译器而改变。 最好使用括号来确保输出