s ++和* s ++之间有什么区别吗?

时间:2012-04-03 11:33:15

标签: c pointers

我是C的初学者,让我说我有这样的代码:

#include <stdio.h>
void test(char *t)
{
     t++;
    *t = 'e';
}

void main()
{
    char a[] = "anto";
    printf("%c\n",a[1]);
    test(a);
    printf("%c\n",a[1]);
}

这是示例代码,我正在弄清楚指针是如何工作的。根据我的说法:

t++;
上面代码中的

将在调用函数a中增加1 char的数组test的地址。很好,现在我知道*用于检索指针指向的对象值。

但奇怪的是,当我将t++更改为

*t++;

我得到的输出和以前一样。上面的陈述,我对这一点感到困惑 *t++;应根据*运算符的定义更改仅知道的内容。

但是这又改变了t的地址。怎么会?我在哪里弄错了这个概念?

提前致谢

4 个答案:

答案 0 :(得分:10)

表达式*t++被解析为*(t++) - ++仍然适用于指针,而不是内容。 t++的值是递增前指针本身的值,而*t++的值是指针在递增之前指向的值。

答案 1 :(得分:4)

(*)运算符用于取消引用指针。

t++;

作为语句返回指针的前一个位置,如

*t++;

返回t指针在递增之前指向的值。

这两个陈述的副作用是相同的,所以你得到相同的输出。

*t++;

语句不会更改t指向的值,因为++运算符的优先级高于*运算符。

答案 2 :(得分:2)

++的优先级高于*,因此您的表达式的计算结果为*(t++)

答案 3 :(得分:1)

Postfix ++的优先级高于一元*,因此*t++被解析为*(t++);你取消引用表达式t++的结果;作为副作用,t是先进的。

一元*和一元++具有相同的优先级,因此如果它们出现在同一表达式中,则会从左到右进行评估。表达式*++t将被解析为*(++t);您取消引用表达式++t的结果,并且副作用t已提前。

++*t将被解析为++(*t);你正在递增表达式*t的结果。