0

像往常一样,维基百科关于结构的文章不太清楚。它给出了结构的语法,如下所示:

[typedef] struct [struct_name]
{
    type attribute;
    type attribute2;
    /* ... */
    [struct struct_name *struct_instance;]
} [struct_name_t] [struct_instance];
  • typedef 关键字在这里会做什么?
  • [struct_name] 是什么意思?(它是你给新结构数据类型起的名字吗?)
  • [struct_name_t] 是什么意思?
  • [struct_instance] 是什么意思?(它是在创建结构的单个实例吗?)
  • 我假设[struct struct_name *struct_instance;]在结构中创建了一个指向该结构的第二个实例的指针)。正确的?

我将不胜感激一个例子:假设我有三个文件:main.c、sub.c 和 sub.h。我想在 sub.h 中声明一个结构的实例,并在 sub.c 中实例化并使用它。假设我想要一个带有成员char name[20]and的 Song 类型结构,char artist[10]并说我想创建一个实例 mySong, {"Meinging", "Me"},这在 sub.c 和 sub.h 中看起来如何?

谢谢

4

4 回答 4

3

•What would the typedef keyword do here?

它允许您创建结构的 typedef,就像任何其他类型一样。这使您不必struct xxx struct_name每次都键入。你不需要这个,因此[]

•What does the [struct_name] mean? (Is it the name you're giving to the new struct data type?)

是的,如果你也选择了。你也可以创建一个无名的结构,这样你就不需要给它一个名字。

•What does the [struct_name_t] mean?

这是 typedef 的名称,如果您选择 typedef 结构

•what does the [struct_instance] mean? (Is it creating a single instance of the struct?)

是的,它用于创建结构的一个或多个实例

•I presume [struct struct_name *struct_instance;] creates a pointer in the struct which would point to a second instance of the struct). Correct?

对,这对于链表中的“下一个”类型指针很有用。

结构示例:

typedef struct foo{
    int count;
    struct foo *next;
} foo_t myfoo;

是填写的一个例子;这允许您通过以下方式声明新结构:

 foo_t new_foo_struct;

因为 typedef 和 typedef 的名字。如果你省略这样的:

struct foo{
    int count;
    struct foo *next;
} myfoo;

现在您必须struct为每个实例使用关键字,例如:

 struct foo new_foo_struct;

将其分解为超过 1 个文件:

/*sub.h*/
typedef struct{
char name[20];
char artist[10];
}song;

然后在源码中:

/*sub.c*/
#include "sub.h"

/*this needs to go into a function or something...*/
song mysong;
strcpy(mysong.name, "Mesinging");
strcpy(mysong.artist, "Me");
于 2013-05-13T12:25:37.720 回答
2

那篇文章只是错误地混合了不同的概念,现在更正了。结构体是通过声明的

struct tagname {
  ... fields ...
};

仅此而已,只是该tagname部分在某些情况下是可选的。

另外你可以

  • struct通过声明类型的别名typedef
  • struct或类型的变量

“一口气”,但我认为它不是很好的风格,应该分开。

于 2013-05-13T12:32:34.800 回答
1
sub.h
------
typedef struct{
char name[20];
char artist[10];
}song;


sub.c
----
song mysong={"Me Singing","Me"};
于 2013-05-13T12:28:15.070 回答
0
typedef struct struct_name
{
   char name[20];
   char artist[10];
}struct_name_t structInstance; 

typedef - 这意味着您正在创建一个新类型 ( struct_name_t)

因此,在 C 代码中,您可以像这样创建一个实例:

struct_name_t myVariable;

或者你可以明确地写:

struct struct_name myVariable;

最后structInstance的意思是您想在定义它的同时创建结构的实例(并且该变量的名称是 structInstance)。它不是你会一直使用的东西,但它在某些情况下很有用。

如果要创建结构的实例并在创建时分配/初始化成员,可以这样做:

struct_name_t myVariable = { "Foo", "bar" };

“名称”成员将包含“Foo”,艺术家成员将包含“bar”。

注意:如果你写这个:

struct_name_t myVariable = { 0 };

这将用零填充你的整个结构!

于 2013-05-13T12:28:19.293 回答