C - 具有前后增量的指针行为

时间:2014-11-19 08:34:27

标签: c pointers

我正在做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呢?

6 个答案:

答案 0 :(得分:2)

请检查以下链接: Difference between ++*argv, *argv++, *(argv++) and *(++argv)

您需要了解运营商优先顺序才能了解此处发生的情况。

++运算符优先于*

答案 1 :(得分:2)

表达

*ptr++;

有价值

*ptr
在递增ptr然后ptr增加之前

。写

是没有意义的
*ptr++;

因为未使用递增*ptr之前ptr的表达式值。所以实际上是这些表达式的结果(表达式语句)

ptr++;

*ptr++;

是一样的。

对于表达式*++ptr++*ptr,然后在这个表达式中* ++ ptr首先ptr递增(即它将指向数组的第二个元素),然后解除引用及其值是第二个元素的值。 在这个表达式++*ptr中,首先返回数组的第一个元素的值(即3),然后这个值递增,你得到4。

答案 2 :(得分:1)

ptr ++和* ptr ++在它们返回之后递增指针,在第一种情况下,指向ptr指向的先前地址,在第二种情况下,指向该地址的值。你没有对结果做任何事情,所以你没有看到差异。

* ++ ptr将首先递增ptr,然后返回它现在指向的值。

++ * ptr将获得ptr指向的值,递增它,然后返回。

答案 3 :(得分:0)

这是由于C中的运营商优先级。以下链接可以帮助您

增量或减量运算符的优先级高于解除引用运算符。所以

*ptr++; is similar to *(ptr++)

http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm

答案 4 :(得分:0)

由于运算符优先级*pt++;*(ptr++);相同,因此它会递增指针,然后取消引用指针并且不执行任何操作。

答案 5 :(得分:0)

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