关于C++:当我想为结构声明新成员时,有些问题我不明白。

When I want to declare new members for a Struct,some trouble I don't understand

本问题已经有最佳答案,请猛点这里访问。

我初始化如下结构成员:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct MyStruct {

  int member_a;

};
int main(){

MyStruct s;//method 1

MyStruct * ps;//method 2

return 0;
}

方法1和方法2有什么区别?为什么有人使用方法1,有些人使用方法2?


您的结构有一个成员,以后不添加任何其他成员,不能在结构外部添加。

请看我的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 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
"
,sTest.x);

    return 0;
}

所以,当你这样做的时候:

1
2
3
MyStruct s;//method 1

MyStruct * ps;//method 2

你实际上是这样做的:

1
MyStruct s;

你说要创建一个MyStruct类型的结构,称为s。内存将分配给它,但它的成员不是手动初始化的,您可能需要记住这一点!

然后这个

1
MyStruct * ps;

创建一个指向结构的指针,称为ps。也就是说,ps准备指向MyStruct类型的结构。它是指向结构的指针,而不是结构。

我的例子来源在这里。

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

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


我通常使用方法2。在二进制树这样的数据结构中,如果我有一个指向结构节点的指针,比如temp_指针,现在我需要将其更改为其左_子级,我可以简单地使指针指向左_子级。现在,如果我需要更改左_子节点中的某个值,我可以简单地在temp_指针指向的节点中更改该值。这在方法1中是不可能的。在这里,我们将有一个单独的左子项的副本,而不是指向左子项的指针(单独的副本将具有相同的值,但地址不同)。方法_1不会更改原始节点(即左_子节点)中的值,但只会更改副本中的值。

另外,假设我们有一个mystrut指针和另一个temp指针。我们可以比较两者(mystrut_pointer==temp_pointer),并检查它们是否指向同一个节点。这在方法1中是不可能的。

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


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