c中结构运算符之间的区别

时间:2018-04-10 00:23:17

标签: c

我是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);
}

2 个答案:

答案 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;

现在你必须'命名'类型:myNodeTypenode是相同的。你可以用它们来声明变量和指针:

 myNodeType var1; // variable
 node *next;  // pointer.

和变量声明的情况一样,您可以将它与结构声明结合起来,如示例所示。

malloc只分配一块动态内存并返回其地址,即指向它的指针。所以,node* current = (node*)malloc(sizeof(node));只是将指定的内存地址分配给指针current

希望它有所帮助。

相关问题