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; |
你说要创建一个
然后这个
1 | MyStruct * ps; |
创建一个指向结构的指针,称为
我的例子来源在这里。
正如crhis所指出的,一本书(见这里的相关列表)可能是你需要的,因为你的文章中有很多混乱。在线教程也不错。
还要注意C和C++是两种不同的编程语言。
我通常使用方法2。在二进制树这样的数据结构中,如果我有一个指向结构节点的指针,比如temp_指针,现在我需要将其更改为其左_子级,我可以简单地使指针指向左_子级。现在,如果我需要更改左_子节点中的某个值,我可以简单地在temp_指针指向的节点中更改该值。这在方法1中是不可能的。在这里,我们将有一个单独的左子项的副本,而不是指向左子项的指针(单独的副本将具有相同的值,但地址不同)。方法_1不会更改原始节点(即左_子节点)中的值,但只会更改副本中的值。
另外,假设我们有一个mystrut指针和另一个temp指针。我们可以比较两者(mystrut_pointer==temp_pointer),并检查它们是否指向同一个节点。这在方法1中是不可能的。
记住,这个方法只声明一个指向mystrut类型的指针。要实际创建mystrut类型,必须使用malloc或calloc分配内存。
应该使用方法1,因为方法2没有声明mystrut类型的变量,所以它声明了一个指针(指向mystrut类型的变量)。