c中间接运算符的rvalue

时间:2012-07-15 13:36:48

标签: c

我对以下声明的工作感到困惑:

*ptr++->str

第一个++运算符应用于返回rvalue的ptr。必须应用下一个运算符->->运算符不需要左值?

2 个答案:

答案 0 :(得分:1)

  

->运算符需要左值?

没有。见C99标准第6.5.2.3节:

  

->运算符的第一个操作数应具有指向限定或不合格的类型''指针   结构''或''指向合格或不合格的联合''的指针,第二个操作数应为   命名指向该类型的成员。

     

...

     

后缀表达式后跟->运算符,标识符指定成员   结构或联合对象。该值是对象的指定成员的值   第一个表达式指向的,并且是左值。

这就是关于此事的所有内容。

答案 1 :(得分:0)

这可能是结构的可能定义。

#include <stdio.h>

struct fuzz {
        char *str;
        } stuff = {"Hi there!"} ;

struct fuzz *ptr = &stuff;

int main()
{
char ch='@';

printf("Before: p=%p, ch=%c\n", (void*) ptr, ch);

ch = *ptr++->str;

printf("After: p=%p, ch=%c\n", (void*) ptr, ch);


return 0;
}

输出:

Before: p=0x601020, ch=@
After: p=0x601028, ch=H

输出证明指针表达式是左值。可修改,如果str不指向字符串常量。