假设我有一个结构:
struct ABC
{
char a;
char b;
char c;
}
我可以将指向上述结构的指针声明为:
struct ABC** abc
现在abc
是指向结构指针*abc
的指针,*abc
是指向结构abc
的结构指针。从而; sizeof(**abc)
将为4,sizeof(*abc)
也将为4,sizeof(abc)
将为3(考虑指针大小为4个字节,字符大小为1个字节)。
我的问题是:
如何使用上面声明的c
声明指向成员变量abc
的字符指针?
答案 0 :(得分:5)
sizeof(**abc) will be 4, sizeof(*abc) will also be 4 and sizeof(abc) will be 3
我认为应该是,假设没有填充结构,
sizeof(**abc) will be 3, sizeof(*abc) will also be 4 and sizeof(abc) will be 4
^^^ ^^^
Change here change here
获取指向成员变量c的指针
&(*abc)->c
请注意*abc
周围的问题。原因是->
的优先级高于*
,所以你需要确保第一次取消引用(从指针指向指针)首先发生。
或者你可以做到
&(**abc).c
括号的相同原因......在应用member-selection-via-object-name .
之前,需要确保已取消引用(两次)。
答案 1 :(得分:4)
如果你的所有指针都是有效的,那么你可以取消引用它们,你可以这样做:
char* a_ptr = &((*abc)->a);
or
char* b_ptr = &((**abc).b);
答案 2 :(得分:3)
你的意思是?
char *c = &((**abc).c);
char *d = &((*abc)->c);
或者你可以写一些清晰的东西:
ABC **pp == foo();
ABC *p = *pp;
char *c = &(p->c);
自写这篇文章以来,我意识到我甚至不理解导致这个问题的思维过程。让我们分解一下:
问:从结构参考中,我如何获得成员参考?
答:使用成员访问运算符.
char &c = r.c;
问:从结构参考中,我如何获得指向成员的指针?
答:使用地址运算符&
char *c = &r.c;
问:从结构指针,我如何获得成员参考?
答:使用成员访问运算符->
char &c = p->c;
问:从结构指针,我如何获得指向成员的指针?
答:如果只有某种方法可以合并2和3!
char *c = &p->c;
问:从指针到指针,如何获得常规指针?
答:使用取消引用运算符*
ABC **pp = foo();
ABC *p = *pp;
问:从指向结构的指针,如何获得指向成员的指针?
我可以问这个过程中的哪一步造成了困难吗?
答案 3 :(得分:3)
&(*abc)->c
,但您可能希望为了易读性而采取措施:
struct ABC *foo = *abc;
char *bar = &foo->c;
答案 4 :(得分:3)
有几种方法可以解释您的问题,因为在其中使用了一些略微奇怪的命名法。我将在这里探讨两个。
您有一个ABC
对象,并且您希望指向该对象中的一个char
成员。
嗯,这是对象:
ABC obj;
以下是您到目前为止提到的指示:
ABC* ptr1 = &obj;
ABC** ptr2 = &ptr1;
这是你要求的指针,用三种等价方式声明:
char* theChar1 = &(obj.c);
char* theChar2 = &(ptr1->c);
char* theChar3 = &((*ptr2)->c);
您没有ABC
对象,但是您想要一个指向成员的指针,以后可以将其应用于某些c
对象的成员ABC
你稍后会获得。
不,你没有。
答案 5 :(得分:2)
如何使用上面声明的abc声明指向成员变量c的字符指针?
这样:
char *p = &(*abc)->a;
它将p
声明为指向char
和p
指向结构成员a
的指针。需要括号,因为后缀运算符的优先级高于一元运算符。