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.
的内存。
*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;
我的理解是 -> 运算符 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.
*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;