You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于*(++p)->t、*++p->t和++*p->t的C语言语法疑问

C语言指针表达式与运算符优先级问题解析

示例代码

#include <stdio.h>

int main() {
    char u[] = "UVWXYZ";
    char v[] = "xyz";
    struct T {
        int x;
        char c;
        char *t;
    } a[] = {{11, 'A', u}, {100, 'B', v}}, *p = a;

    p = a;
    printf("*(++p)->t = %c\n", *(++p)->t);
    p = a;
    printf("*++p->t = %c\n", *++p->t);
    p = a;
    printf("++*p->t = %c\n", ++*p->t);
}

运行结果

*(++p)->t = x
*++p->t = V
++*p->t = W 

问题解析

1. *(++p)->t与*++p->t结果不同的原因

核心是C语言运算符优先级:->的优先级高于前缀++和*,两个表达式的执行逻辑完全不同:

  • *(++p)->t的执行流程:
    1. 先执行++p:结构体指针p从指向a[0]自增为指向a[1]
    2. 再执行->t:取a[1]的t成员,该成员指向v数组首地址(对应字符'x')
    3. 最后执行*:解引用得到'x'
  • *++p->t的执行流程:
    1. 先执行p->t:此时p指向a[0],取其t成员,指向u数组首地址(对应字符'U')
    2. 再执行++:对t指针本身自增,使其指向u[1](对应字符'V')
    3. 最后执行*:解引用得到'V'

简言之,前者自增的是结构体指针p,后者自增的是结构体成员里的字符指针t,优先级差异导致了本质区别。

2. ++*p->t输出'W'而非预期'V'的原因

这是因为第二个printf的操作已经修改了a[0].t的指向:

  • 在第二个printf中,++p->t直接修改了a[0]的t成员,让它从指向u[0]变为指向u[1]
  • 执行第三个printf时,p重新指向a[0],此时a[0].t已经指向u[1](值为'V')
  • ++*p->t的执行流程是:先解引用t得到'V',再对该值自增为'W',最终输出'W'

内容的提问来源于stack exchange,提问作者ArcherSore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:57:36