此嵌套的struct声明是什么意思?

时间:2019-08-06 18:24:22

标签: c++ arrays struct datamember

#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;
}

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

2 个答案:

答案 0 :(得分:2)

例如考虑此声明

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

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

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

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,该对象的owo具有封闭的未命名数据结构的数据成员uwu,而该成员又具有最内部未命名结构的数据成员iwi。

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

owo.uwu.iwi.OwO

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

以同样的方式,我们可以使用此完整表达式将其输出

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

答案 1 :(得分:1)

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

这是使用命名类型和索引而不是取消引用的同一件事。

Player