【问题标题】:What does this nested struct declaration mean? [closed]这个嵌套结构声明是什么意思? [关闭]
【发布时间】:2019-12-14 08:34:10
【问题描述】:
#include <bits/stdc++.h>

using namespace std;
struct {
  struct {
    struct {
      char *OwO[12];
    }iwi;
  }uwu;
}owo;

int main() {
  *owo.uwu.iwi.OwO = "What's this?";
  printf("%s\n", *owo.uwu.iwi.OwO);
  return 0;
}

大家好,我不知道这段代码实际上是如何工作的?谁能给我解释一下?

【问题讨论】:

  • 那是 C++,但你已经用 C 标记了这个问题。如果你认为代码是 C,那么答案就是 C++。如果您认为它是 C++ 并且想要解释它在 C++ 中的含义,那么您错误地标记了这个问题。无论哪种情况,您不了解哪些具体部分?你了解#include吗?你了解using吗?你了解struct 声明吗? main后面第一行的赋值你看懂了吗?你了解printf 声明吗?
  • 你应该永远 #include &lt;bits/stdc++.h&gt;。它不是正确的 C++。它破坏了便携性并养成了糟糕的习惯。见Why should I not #include &lt;bits/stdc++.h&gt;
  • 另外,请避免using namespace std;。这被认为是不好的做法,会毁了你的生活。见Why is “using namespace std;” considered bad practice?

标签: c++ arrays struct datamember


【解决方案1】:

以这个声明为例

struct {
  char *OwO[12];
}iwi;

它首先声明了一个未命名的结构,其中包含一个数据成员,该数据成员具有数组类型,该数组包含 12 个 char * 类型的元素。然后它声明了一个名为iwi的对象结构。

所以要访问对象iwi的数据成员OwO,可以使用表达式

iwi.OwO

返回数组OwO的左值。

如果将运算符 * 应用于表达式,则数组 OwO 会隐式转换为指向其第一个元素的指针,并且类型为 char **。取消引用指针,我们得到char * 类型数组的第一个元素。

我们可以用字符串字面量为元素赋值

*iwi.OwO = "What's this?";

这是数组的第一个元素,类型为char *,现在获取字符串文字的地址。

这是一个演示程序

#include <stdio.h>

struct {
  char *OwO[12];
} iwi;

int main(void) 
{
    *iwi.OwO = "What's this?";

    printf( "%s\n", *iwi.OwO );

    return 0;
}

它的输出是

What's this?

在原始代码中,这个未命名的结构包含在另外两个未命名的结构中

struct {
  struct {
    struct {
      char *OwO[12];
    }iwi;
  }uwu;
}owo;

即具有未命名外部结构的对象 owo,该对象具有封闭的未命名数据结构的数据成员 uwu,而该数据成员又具有最内部未命名结构的数据成员 iwi。

所以要访问数据成员OwO,我们必须列出对象的所有名称

owo.uwu.iwi.OwO

所以我们已经获得了对最内部数据成员OwO 的访问权限。现在取消引用上面演示程序中显示的表达式,我们用字符串文字"What's this?" 初始化数组的第一个元素。

同样我们可以使用这个完整的表达式输出它

printf("%s\n", *owo.uwu.iwi.OwO);

【讨论】:

    【解决方案2】:

    它是几个嵌套的未命名结构类型。

    使用命名类型和索引而不是取消引用也是同样的事情。

    struct Inner
    {
        char* OwO[12];
    };
    
    struct Middle
    {
        Inner iwi;
    };
    
    struct Outer
    {
        Middle uwu;
    };
    
    Outer owo;
    
    int main() {
      owo.uwu.iwi.OwO[0] = "What's this?";
      printf("%s\n", owo.uwu.iwi.OwO[0]);
      return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-01
      • 2014-09-20
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      相关资源
      最近更新 更多