我是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
的地址。怎么会?我在哪里弄错了这个概念?
提前致谢
答案 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
的结果。