为什么我需要将变量指向结构

Why do I need to point a variable to a structure

本文关键字:结构 变量 为什么      更新时间:2023-10-16

在下面的2个代码示例中(下面的第一个代码块,第二个较低代码块没有)

#include <iostream>
#include <vector>
#include <string>
struct padStruct
{
    int buttonID;
    long timeMS;
    std::string codetoSEND;
};
int main()
{
    padStruct s = {0,0,""}, *s2;
    s2 = &s;
    s.buttonID = 3; //or (*s2).buttonID = 3;
    s.timeMS = 1200; //or (*s2).timeMS = 1200;
    s.codetoSEND = "play song"; //or (*s2).codetoSEND = "play song";
    std::cout << (*s2).buttonID << ',' << (*s2).timeMS << ',' << '"' << (*s2).codetoSEND << '"' << 'n';
}

这有效。

而不是:

#include <iostream>
#include <vector>
#include <string>
struct padStruct
{
    int buttonID;
    long timeMS;
    std::string codetoSEND;
};
int main()
{
    padStruct *s = {0};
    //padStruct *s = {0,0,""} //Error C2078 too many initializers
    (*s).buttonID = 3; //or (*s2).buttonID = 3;
    (*s).timeMS = 1200; //or (*s2).timeMS = 1200;
    (*s).codetoSEND = "play song"; //or (*s2).codetoSEND = "play song";
    std::cout << (*s).buttonID << ',' << (*s).timeMS << ',' << '"' << (*s).codetoSEND << '"' << 'n';
}

这不是。

有人可以简单地解释

  1. 为什么我不能在底部代码上使用padStruct *s = s = {0,0,"),否则在顶部工作时,否则我会得到错误C2078 C2078太多的初始化器<</em> |

  2. 更重要的是,为什么我必须创建一个填充变量S,然后再创建一个PADSTRUCT *S2,然后必须将S2指向S?否则我会得到错误C2228:'.buttonid'的左侧必须具有类/struct/union/em>

非常令人困惑。也许至少解释了第二个问题有点容易,所以它沉入了。谢谢

为什么我不能初始化padStruct *s = {0, 0, "")

因为s是指指针,而不是复合类型。它可以以您的方式初始化为零,也可以将其指向padStruct的新实例的指针,但它是一个项目。

为什么我必须创建一个padStruct变量s,然后是padStruct *s2,然后必须将s2指向s

您需要初始化s2指针以指向padStruct的实例。将其指向s是一种选择,但是还有其他选项。例如,您可以写

padStruct *s = new padStruct { 0, 0, "" };

甚至

padStruct *s = new padStruct { 3, 1200, "play song" };

避免一个一个一个一个。

请注意,您可以使用s->buttonID语法代替(*s).buttonID

在第一个块上,您定义了一个实际的padStruct s对象,并定义另一个简单 Pointer s2 to padStruct

padStruct s = {0,0,""}, *s2

对于s2 = &s,将s2指向s没错,s2指针s的地址,该地址是在堆栈中分配的。因此,当您通过(*s2).buttonID取消s2时,该值实际上来自s。(与s.buttonID相同)

在下一个块上,您要做的是initialize a pointer with {0}。这是错误的。指针应初始化为0nullptr{0}仅适用于POD struct

padStruct *s = {0};

您需要为s(例如padStruct *s = new padStruct)准备空间,然后s实际上将指向真实的东西。并记住在最后删除它。