我正在做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++
?这是否意味着:
顺便说一句,当我打印出n
的值时,它仍然是3,6,9,12,15
。
抱歉第二个问题:
我们如何解释*++ptr
和++*ptr
呢?
答案 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)
优先顺序也取决于编译器。它可能会根据编译器而改变。最好使用括号来确保输出