我是c的结构新手,我一直在研究它之间的区别。运算符,以及 - >运营商。但我似乎无法找到解释我想知道的资源。那么,为什么我在没有typedef的情况下创建结构,我可以直接使用它,例如“header.first = x”,而不必说“struct header varName”吗?另外,有什么区别。和 - >在这个例子中,因为在这种情况下,我可以互换使用它们。
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node* next;
}node;
struct header{
int count;
node *first;
}header;
int main()
{
node *curptr = (node*)malloc(sizeof(node));
printf("%p\n",curptr);
header.first = curptr;
printf("%p\n",header.first);
header.count = 10;
printf("%i\n\n\n",header.count);
node* current = (node*)malloc(sizeof(node));
current->data = 5;
current->next = NULL;
printf("%i\n",current->data);
printf("%p",current);
}
答案 0 :(得分:0)
struct header { ... } header;
同时创建结构类型(struct header
)以及创建类型为header
的名为struct header
的全局变量。它等同于:
struct header { ... };
struct header header;
当您编写header.first = x
时,您所做的只是修改名为header
的全局对象。
typedef struct node { ... } node;
同时创建结构类型(struct node
)以及它的typedef(node
)。它等同于:
struct node { ... };
typedef struct node node;
至于.
vs ->
:a->b
相当于(*a).b
。它只是syntactic sugar。
答案 1 :(得分:0)
c中的struct是内存中的一个位置,它足以保存其所有字段的数据。与'c'中的任何其他对象一样,您可以选择将其用作变量或使用指向它的指针。指针本质上是此变量的内存地址。
此外,'c'中的每个变量都有一个类型。后者的行为类似于创建变量和检查其用法的模板。
因此,在下面的示例中,您将创建一个结构类型struct header
并描述它包含的内容。
struct header{
int count;
node *first;
};
现在,使用该类型,您可以创建名为my_header
的变量:
struct header my_header;
或者,如您的示例中所示,变量header
。
struct header header;
在您的示例中,您可以将两者合并为一个语句。
现在,如果您创建了一个“struct header”类型的变量,则可以使用.
运算符访问其成员。以下运算符将使'c'访问struct变量的成员计数。它将在内存中计算正确的位置以将“10”放入其中。
header.count = 10;
对于指针,您可以创建一个变量来保存对象的地址。在'c'中,它需要知道它指向的对象类型。因此,以下示例中的指针ptr
被分配了变量&
的地址header
。
struct header *ptr = &header;
现在您可以使用指针访问标题中的字段,但它需要不同的语法->
。所以,以下陈述将等同于前一个陈述:
ptr->count = 10;
请注意,在这两种情况下,'10'被分配给绝对相同的对象,即变量'header'的字段。
为了让生活更轻松,每次停止输入struct
,你可以使用typedef
运算符声明一个命名类型,即
typedef struct node myNodeType;
typedef struct node node;
现在你必须'命名'类型:myNodeType
和node
是相同的。你可以用它们来声明变量和指针:
myNodeType var1; // variable
node *next; // pointer.
和变量声明的情况一样,您可以将它与结构声明结合起来,如示例所示。
malloc
只分配一块动态内存并返回其地址,即指向它的指针。所以,node* current = (node*)malloc(sizeof(node));
只是将指定的内存地址分配给指针current
。
希望它有所帮助。