首页 > 解决方案 > 这个嵌套结构声明是什么意思?

问题描述

#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++arraysstructdatamember

解决方案


例如考虑这个声明

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

它首先声明了一个未命名的结构,其中包含一个数据成员,该数据成员的类型为具有 12 个类型元素的数组char *。然后它声明一个以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,该结构具有封闭的未命名数据结构的数据成员 uwu,而该数据成员又具有最内部未命名结构的数据成员 iwi。

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

owo.uwu.iwi.OwO

这样我们就可以访问最内部的数据成员了OwO。现在取消引用上面演示程序中显示的表达式,我们用字符串字面量初始化数组的第一个元素"What's this?"

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

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

推荐阅读