如果指针*p
表示已存储的值,p
表示地址(对于声明int *p
)。
根据以下声明,name
指向字符串“Example”。所以*name
将是“E”而不是地址,而是实际值。那么下面的程序如何运作?我的意思是,我们正在递增值本身而不是指针(混淆)。
char *name="Example";
while(*name !='\0'){
printf("%c\n",*name++);
}
打印
E
x
a
m
p
l
e
答案 0 :(得分:0)
您错误解释了*name++
表达式:即使++
跟在*name
之后,它也仅适用于name
,而不是*name
,因为运算符++
}具有比指针解引用运算符*
更高的优先级。
此优先规则在C程序中非常常用。例如,K& R的单行strcpy
实现使用该表达式两次:
void strcpy( char* dest, const char *src) {
while (*dest++ = *src++)
;
}
答案 1 :(得分:0)
递增name++
的优先级高于取消引用。 *name
。
所以它基本上是:*(name++)
。而不是:(*name)++
答案 2 :(得分:0)
正如您在http://en.cppreference.com/w/c/language/operator_precedence的表格中所看到的,后缀++
的优先级高于取消引用*
。所以会发生的事情是评估第一个name++
,它会使指针递增但返回原始地址,然后调用operator*
(取消引用/间接)。
因此效果是您取消引用指针的当前值,但随后指针会递增。