通过指向指针的方法访问struct元素的地址

时间:2013-05-30 14:54:24

标签: c++ c pointers memory struct

假设我有一个结构:

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的字符指针?

6 个答案:

答案 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);

自写这篇文章以来,我意识到我甚至不理解导致这个问题的思维过程。让我们分解一下:

  1. 问:从结构参考中,我如何获得成员参考?

    • 答:使用成员访问运算符.

      char &c = r.c;
      
  2. 问:从结构参考中,我如何获得指向成员的指针?

    • 答:使用地址运算符&

      char *c = &r.c;
      
  3. 问:从结构指针,我如何获得成员参考?

    • 答:使用成员访问运算符->

      char &c = p->c;
      
  4. 问:从结构指针,我如何获得指向成员的指针?

    • 答:如果只有某种方法可以合并2和3!

      char *c = &p->c;
      
  5. 问:从指针到指针,如何获得常规指针?

    • 答:使用取消引用运算符*

      ABC **pp = foo();
      ABC *p = *pp;
      
  6. 问:从指向结构的指针,如何获得指向成员的指针?

    • 答:留给读者练习
  7. 我可以问这个过程中的哪一步造成了困难吗?

答案 3 :(得分:3)

&(*abc)->c,但您可能希望为了易读性而采取措施:

struct ABC *foo = *abc;
char *bar = &foo->c;

答案 4 :(得分:3)

有几种方法可以解释您的问题,因为在其中使用了一些略微奇怪的命名法。我将在这里探讨两个。


场景1

您有一个ABC对象,并且您希望指向该对象中的一个char成员。

嗯,这是对象:

ABC obj;

以下是您到目前为止提到的指示:

ABC*  ptr1 = &obj;
ABC** ptr2 = &ptr1;

这是你要求的指针,用三种等价方式声明:

char* theChar1 = &(obj.c);
char* theChar2 = &(ptr1->c);
char* theChar3 = &((*ptr2)->c);

场景2

您没有ABC对象,但是您想要一个指向成员的指针,以后可以将其应用于某些c对象的成员ABC你稍后会获得。

不,你没有。

答案 5 :(得分:2)

  

如何使用上面声明的abc声明指向成员变量c的字符指针?

这样:

char *p = &(*abc)->a;

它将p声明为指向charp指向结构成员a的指针。需要括号,因为后缀运算符的优先级高于一元运算符。