C语言中的指针优先级和解传递

C语言中的指针优先级和解传递,c,pointers,C,Pointers,我很难弄清楚每一个陈述是如何运作的,有人能详细说明一下我们做了什么吗 1:++p->age不应该增加p,然后访问成员age struct student{ int age; char *name; }; struct student b[3] = { 30, "Peter", 40, "Mary", 50, "John" }; struct student *p = b; int main() { printf("%d\n", ++p->age); p

我很难弄清楚每一个陈述是如何运作的,有人能详细说明一下我们做了什么吗

1:
++p->age
不应该增加
p
,然后访问成员
age

struct student{
    int age;
    char *name;
};
struct student b[3] = { 30, "Peter", 40, "Mary", 50, "John" };
struct student *p = b;



int main()
{
    printf("%d\n", ++p->age);
    printf("%s\n", (*p).name);
    printf("%c\n", *p->name-1);
    printf("%c\n", *++p->name);
    printf("%c\n", *p++->name);
    printf("%c\n", *(++p)->name);
}
首先执行
p->age
。然后,前缀增量运算符(
++
)将该值增加1,并打印该值(
31

这里,
(*p).name
p->name
相同。这将打印
Peter

printf("%s\n", (*p).name);
首先,
p->name
执行,它给出了
Peter
。应用解引用运算符将给出
Peter
的第一个字符,即
P
。从
P
中减去一得到
O
,这就是要打印的字符

printf("%c\n", *p->name-1);
printf("%c\n", *++p->name);
printf("%c\n", *p++->name);
在这里,
p->name
首先执行并给出
Peter
。当该值增加时,它将给出
eter
。当应用解引用运算符时,我们得到
eter
的第一个字符,即
e
。这是要打印的字符

printf("%c\n", *p->name-1);
printf("%c\n", *++p->name);
printf("%c\n", *p++->name);
在这里,
++
首先执行。因为它是后缀增量运算符,所以返回原始值。然后,
->
执行,这给我们提供了
eter
(因为它在前面的
printf
中已经增加了)。当这里应用
*
操作符时,我们得到
e
。这是印刷品

printf("%c\n", *p->name-1);
printf("%c\n", *++p->name);
printf("%c\n", *p++->name);
这里,
p
递增。现在,它指向
b[2]
(在前面的
printf
中,它增加了一次)。然后,
->
执行,它给出了
John
。应用
*
操作符,我们得到
J
,并打印出来

printf("%c\n", *p->name-1);
printf("%c\n", *++p->name);
printf("%c\n", *p++->name);
阅读有关的内容会很方便。

“对于++p->age,不是应该增加p,然后访问成员年龄吗?”否。
p->age
是先执行的阅读这可能会有所帮助。