C 中的 ptr->thing 和 *ptr->thing 有什么区别?

What is the difference between ptr->thing and *ptr->thing in C?

我的理解是 -> 运算符 shorthand 用于取消引用指向结构的指针,并访问一个结构成员的值。

struct point {
   int x;
   int y;
};
struct point my_point = { 3, 7 };
struct point *p = &my_point;  /* p is a pointer to my_point */
(*p).x = 8;                   /* set the first member of the struct */
p->x = 8;                     /* equivalent method to set the first member of the struct */

所以上面例子的最后两行是等价的。但是我遇到了一些类似的代码:

*p->x = 8

同时使用星号和箭头。这是做什么的?这会尝试“双重取消引用”指针并分配给内存地址 8 或其他地址吗?可能是未定义的行为,或者只是编译器错误?

对于结构

struct tagp
{
   int *x=someaddress;
}p0;
struct tagp *p=&p0;

*p->x访问结构内部指针x中存储的地址。它与 *((*p).x)*(p0.x) 相同,它们访问 Someaddress.

的内存。

勾选this link

*p->x 等同于 *(p->x) - 您正在取消引用 p->x 的结果,这意味着 x 成员本身具有指针类型。给定一行

*p->x = 8;

表示 x 的类型为 int *:

struct foo {
  ...
  int *x;
  ...
};

请注意,必须先为 x 分配一个有效的指针值,然后才能分配给 *x。您可以动态分配内存:

struct foo *p = malloc( sizeof *p ); // dynamically allocate space for 1 instance of struct foo
if ( !p )
  // handle allocation failure and exit here.

p->x = malloc( sizeof *p->x ); // dynamically allocate space for 1 int.
if ( !p->x )
  // handle allocation failure and exit here.

或者您可以将 x 设置为指向现有的 int 对象:

int a;
...
p->x = &a;
*p->x = 8;