5

可以说我有一个结构:

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

4

6 回答 6

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 之前已取消引用(两次).

于 2013-05-30T14:58:06.810 回答
4

如果您的所有指针都是有效的,以便您可以取消引用它们,您可以这样做:

char* a_ptr = &((*abc)->a);
or 
char* b_ptr = &((**abc).b);
于 2013-05-30T14:57:48.603 回答
3

你的意思是像?

char *c = &((**abc).c);
char *d = &((*abc)->c);

或者你可以写一些清晰的东西:

ABC **pp == foo();
ABC *p = *pp;
char *c = &(p->c);

写完这篇文章后,我意识到我什至不了解导致这个问题的思考过程。让我们分解一下:

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

    • A:使用会员访问运算符.

      char &c = r.c;
      
  2. 问:如何从结构引用中获取指向成员的指针?

    • A:使用地址运算符&

      char *c = &r.c;
      
  3. 问:如何从结构指针中获取成员引用?

    • A:使用会员访问运算符->

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

    • A:要是有办法把 2 和 3 结合起来就好了!

      char *c = &p->c;
      
  5. Q:从一个指针到一个指针,如何得到一个正则指针?

    • A:使用解引用操作符*

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

    • A:留给读者练习

请问这个过程中的哪一步造成了困难?

于 2013-05-30T14:58:04.833 回答
3

&(*abc)->c,但为了便于阅读,您可能需要逐步执行:

struct ABC *foo = *abc;
char *bar = &foo->c;
于 2013-05-30T14:58:15.977 回答
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对象的成员。

不,你没有。

于 2013-05-30T15:00:23.853 回答
2

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

这边走:

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

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

于 2013-05-30T14:58:00.680 回答