难以理解表达式 (*(&x->y))

Difficulty understanding the expression (*(&x->y))

我有以下文件结构。我知道指针需要分配内存。文件 A 由 DaVinci 生成。主要是我写的

// File A
typedef struct {
    int v1;
}s1;

struct s2{
    s1 *p1;
};

extern const struct s2 * const p3;  // Expr 1
#define untilp1() (*(&p3->p1))  // Expr 2

// File main
#include <stdio.h>
#include "FileA.h"
int main()
{
    int v2 = 10;
    untilp1()->v1 = v2;  // This line results in failure
    return 0;
}
    

Q1 - 我不理解表达式 1。具体来说,我不理解 expr 1 中这么多 const 关键字的使用。我知道 extern 一词的含义。在这种情况下,我猜一个常量指针 p3 是未定义的,未声明的,但编译器知道它指向常量结构 s2。这个对吗?能说清楚点的请详细说明

Q2 - 我不明白表达式 2。具体来说,我不明白 (*(&p3->p2)) 是怎么回事。我知道#define的意思了。请详细解释表达式。

Q3 - 在一般编码中,我分配内存,例如在声明使用指针之前使用 malloc。我不确定当这些文件由 DaVinci 生成时如何处理。但是我还没有看到我的任何同事使用 malloc 等。有谁知道我是否可以使用 p3untilp1()v2 的值分配给 v1

谢谢。

Q1: p3 是一个 const 指针(意思是指针本身不能改变)到 const struct s2 意思是 struct s2 不能改变要么。

Q2:*(&p3->p1) 获取 struct p3 的成员 p1 的地址,然后取消引用它。使用该宏定义,赋值需要为:(untilp1())->v1 = v2;。参见 Operator Precedence。我的建议是将括号放在宏中。

Q3:“一般编码”- 我认为这需要一个单独的问题。它可能基于意见。

Demo