当我想为一个Struct声明新成员时,有些麻烦我不明白

时间:2015-04-26 13:19:47

标签: c++ c struct

我在下面创建一个Struct成员:

struct MyStruct {

  int member_a;

};
int main(){

MyStruct s;//method 1

MyStruct * ps;//method 2

return 0;
}

方法1和2之间的区别是什么?为什么有人使用方法1而其他人使用方法2?

3 个答案:

答案 0 :(得分:1)

你的结构有一个成员,你以后不添加任何其他成员,你不能在结构之外这样做。

参见我的例子:

// Example 1
// Referencing a structure member locally in "main()" with the "dot operator"

#include <stdio.h>

struct Test // unique definition of the struct
{
    int x;
};

int main(void)
{
    struct Test sTest; // we create an instance of the struct

    sTest.x = 2;       // we assign a value to the member of the struct

    printf("x = %d\n",sTest.x);

    return 0;
}

所以,当你这样做时:

MyStruct s;//method 1

MyStruct * ps;//method 2

你实际上是这样做的:

MyStruct s;

你说要创建一个名为MyStruct的{​​{1}}类型的结构。将为其分配内存,但不会手动初始化其成员,您可能需要记住这些内容!

然后这个

s

创建一个指向结构的指针,称为MyStruct * ps; 。这意味着,ps已准备好 指向 到类型ps的结构。它是结构的 POINTER ,而不是结构。

我的示例来源是here

正如crhis所指出的,一本书(参见SO here的相关列表)可能就是您所需要的,因为您的帖子中存在很多混淆。在线教程也很不错。

另请注意,C和C ++是两种不同的编程语言。

答案 1 :(得分:0)

您应该使用方法1,因为方法2没有声明MyStruct类型的变量,它声明了一个指针(指向MyStruct类型的变量)。

答案 2 :(得分:0)

我通常使用method_2。在像二叉树这样的数据结构中,如果我有一个指向struct_node的指针,比如说temp_pointer,现在我需要把它改成它的left_child,我可以简单地让指针指向left_child。现在,如果我需要更改left_child中的某个值,我可以简单地在temp_pointer指向的节点中更改该值。这与method_1无法实现。在那里,我们将有一个单独的left_child副本而不是指向left_child的指针(一个单独的副本将具有相同的值,但具有不同的地址)。 method_1不会更改原始节点(即left_child)中的值,而只会更改副本中的值。

另外,假设我们有一个mystruct_pointer和另一个temp_pointer。我们可以比较两者(mystruct_pointer == temp_pointer),并检查它们是否指向同一个节点。这对于method_1来说是不可能的。

请记住,此方法_2仅声明指向mystruct类型的指针。要实际创建mystruct类型,您必须使用malloc或calloc分配内存。