我有:
typedef struct
{
int id;
Other_Struct *ptr;
} My_Struct;
假设我的指针abcd
的类型为My_Struct
。
我如何获得以下地址:
abcd->ptr
我的意思是ptr
本身的地址(比如指针指针),而不是ptr
中存储的地址。
答案 0 :(得分:4)
只需使用运营商的&
地址,就像这样
Other_Struct **ptrptr = &(abcd->ptr);
答案 1 :(得分:3)
这个怎么样:
&(abcd->ptr)
答案 2 :(得分:2)
如果我理解正确,在这种情况下你有My_Struct *abcd
指向一个地址,你想要的是这个结构中一个字段的地址(如果这个字段是指针则无关紧要或不)。该字段为abcd->ptr
,因此您需要的地址为&abcd->ptr
。
您可以通过打印实际指针值来轻松检查这一点(地址之间的差异应该会在ptr
内为您提供My_Struct
的偏移量):
struct My_Struct {
int id;
void *ptr;
};
main()
{
struct My_Struct *abcd;
printf("%p %p\n", abcd, &abcd->ptr);
}
更新:如果您希望您的代码具有可移植性,符合标准以及过去和将来的证据,您可能需要向void *
添加强制转换为printf()
参数,根据@alk的评论如下。为了正确起见,您还可以使用标准入口点原型(int main(void)
或int main(int argc, char **argv)
),当然也可以使用stdio.h
来使用printf()
。
答案 3 :(得分:1)
最明确的做法是:
My_Struct *abcd;
Other_Struct **pptr;
pptr = &(abcd->ptr);
我不知道括号是否真的有必要,我也不在乎,因为无论如何它都更具可读性。