2012-04-03 220 views
0

我在C初学者,比方说,我有这样的代码:s ++和* s ++有什么区别吗?

#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++; 
在上面的代码

1char在调用函数test增加阵列a的地址。好吧,据我所知,*用于检索指针指向的对象值。

但是,很奇怪,当我改变t++

*t++; 

我像以前一样得到同样的输出。我完全同意这一点,上面的说法 *t++;应该改变内容只知道,根据运营商的定义*

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

预先感谢

+5

注意:始终在启用警告的情况下编译,例如'gcc -Wall'。 *阅读并注意*这些警告 – 2012-04-03 11:35:56

+0

IIRC在空指针上做数学只是有一个未定义的结果,而解引用空指针有未定义的行为。所以有区别,但只有t为空时才显示出来。 – harold 2012-04-03 11:41:15

+0

@PaulR:谢谢你的建议。 – 2012-04-03 11:44:30

回答

10

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

+0

上找到更多相关的问题。虽然这是正确的,但我不认为它真的回答了OP的问题 – 2012-04-03 11:37:33

+0

@PaulR 1.它的确如此。 2.(对于所有人):这就是为什么即使使用'const char *'也可以实现这个技巧,因为你不能增加一个const值,但是你可以通过一个指向它的指针来实现。 – 2012-04-03 11:38:50

+0

哦谢谢你的回答...现在我很清楚...... – 2012-04-03 11:45:35

2

++优先于*因此您的表达式计算为*(t++)

4

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

t++; 

作为语句返回指针,其中作为

*t++; 

返回该吨指针指向递增它前的值的前一位置。

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

*t++; 

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

1

后缀++具有比一元*更高的优先级,所以*t++被解析为*(t++);您正在取消引用表达式t++的结果;作为副作用,t是先进的。

一元*和一元++相同优先,因此如果他们出现在同一个表达式,他们将评估左到右。表达式*++t将被解析为*(++t);您将表达式++t的结果解引用,并且作为t的副作用是先进的。

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

相关问题