提问者:小点点

当我要为一个结构声明新成员时,有些问题我不理解[重复]


我初始化了一个结构成员,如下所示:

struct MyStruct {

  int member_a;

};
int main(){

MyStruct s;//method 1

MyStruct * ps;//method 2

return 0;
}

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


共3个答案

匿名用户

我通常使用方法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中是不可能的。

记住,这个method_2只声明了一个指向mystruct类型的指针。要实际创建mystruct类型,必须使用malloc或calloc分配内存。

匿名用户

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

请参阅我的示例:

// 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 * ps;

创建指向结构的指针,名为。这意味着已经准备好指向类型的结构。它是指向结构的指针,而不是结构。

我的例子的来源在这里。

正如crhis所指出的,一本书(见相关列表)可能是你所需要的,因为在你的帖子中有很多混乱。在线教程也不错。

还要注意C和C++是两种不同的编程语言。

匿名用户

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