在C

时间:2017-06-13 19:42:00

标签: c

如果指针*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 

3 个答案:

答案 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*(取消引用/间接)。

因此效果是您取消引用指针的当前值,但随后指针会递增。