为啥D的结果是答案,其余3个选项的结果是什么,请请教

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

img

首先,ptr指针指向的是结构体数组a中的第二个元素,也就是定义的第二个结构体2,&a[2]
还是优先级的问题,D选项先是->找到了i1元素2,然后进行前置++,2就变成了3。

struct s 
{
    int i1;
    struct s* i2;
};
static struct s a[3] = { 1,&a[1],2,&a[2],3,&a[0] }, * ptr;

int main()
{
    ptr = &a[1];
    //int a = ptr->i1++;//2,先找到了2赋值给a后,i1才++
    //int a = ptr++->i1;//2,找到了2赋值给a后,指针++指向了下一个
    //int a = *ptr->i1;//错误,无法对int类型解引用
    int a = ++ptr->i1;//3
    printf("%d\n", a);
    return 0;
}

(A) 表达式值为2,ptr指向数组中第2个元素,ptr->i1是2,后缀++返回的是2,i1变成3
(B) 表达式值为2,ptr++后缀++返回指针值仍然指向第二个元素,所以值是2,之后ptr指向第三个元素
(C) 语句非法,i1为整型,不能解引用
(D) 表达式值为3:ptr->i1值是2,前缀++,i1值变为3

(A) 表达式值为2,ptr指向数组中第2个元素,ptr->i1是2,后缀++返回的是2,i1变成3
(B) 表达式值为2,ptr++后缀++返回指针值仍然指向第二个元素,所以值是2,之后ptr指向第三个元素
(C) 语句非法,i1为整型,不能解引用
(D) 表达式值为3:ptr->i1值是2,前缀++,i1值变为3