关于C语言结构的详细教程

关于C语言结构的详细教程,c,structure,C,Structure,有谁能为我提供一个非常好的C语言结构教程吗 我在谷歌上搜索过,但我找到了正常的信息。我正在寻找详细的结构。请让我知道 你总能阅读,这很好。至于“细节”,你到底是什么意思?毕竟,结构相当简单。上面的链接涵盖了常见问题、typedef、指向struct的指针等。如果您对struct还不清楚,也许您应该尝试发布一些更具体的问题。Astructure基本上是一个一个或多个变量的集合,可能是不同类型的 说明: struct foo { int a; int b; }; 结构中的变量名称为成员

有谁能为我提供一个非常好的C语言结构教程吗


我在谷歌上搜索过,但我找到了正常的信息。我正在寻找详细的结构。请让我知道

你总能阅读,这很好。至于“细节”,你到底是什么意思?毕竟,结构相当简单。上面的链接涵盖了常见问题、typedef、指向struct的指针等。如果您对struct还不清楚,也许您应该尝试发布一些更具体的问题。

Astructure基本上是一个一个或多个变量的集合,可能是不同类型的

说明:

struct foo {
  int a;
  int b;
};
  • 结构中的变量名称为成员
编辑: 结构的构件称为:

structure_variable.member
structure_pointer->member
(*structure_pointer).member    // Fiddly; use -> instead
例如:

struct foo test;
struct foo *ptr = &test;
test.a = 1;
ptr->b = 2;
您可以做其他事情,例如:

  • 指向结构的指针
  • 结构数组
注意:

  • 如果结构相当大,则传递指向结构的指针比传递结构本身更有效
好书

  • 优秀的结构介绍

使用C(而不是C++)中的结构时需要记住的一点是,在这样声明它们时,必须使用struct一词:

struct Point location;
因此,您经常会看到它们是用typedef声明的,如下所示:

typedef struct tagPoint {
    int x;
    int y;
    } Point;
typedef struct foo {
  int a;
  int b;
} foo;
然后可以像声明其他类型的点一样声明点:

Point location;

当你第一次看到这个符号时,它可能会让人困惑。

我通常建议(并且一直建议)使用官方指南。对于ANSI C来说,你无法得到比以下更详细和正式的信息。

正如其他人所说,结构只是一组变量。根据您的目标,如果希望通过低级函数(例如,使用指针算术)访问元素,您可能需要考虑填充或打包:结构元素通常在4字节边界(32位)对齐。因此,包含不同大小元素的结构可能需要填充

struct foo {
    int a;
    char b;
    int c;
    char d;
}
在本例中(假设int为4字节,char为1字节,CPU以32位边界对齐),在
b
之后需要3个填充字节来对齐结构。在这种情况下,对结构进行不同的排序可能会更有效。请注意,这不会更改其用法,因为这不会更改成员名称。并非所有处理器都需要对齐结构成员,但使用压缩结构成员(这将节省一些空间)可能会导致速度下降。但在大多数情况下,你不必担心这一点

对于struct周围的typedef,您甚至可以对typedef和struct使用相同的名称,例如:

typedef struct tagPoint {
    int x;
    int y;
    } Point;
typedef struct foo {
  int a;
  int b;
} foo;
这使得使用

struct foo variable;

用于声明类型为
struct foo
的变量

在我看来,键入一个结构是一个坏主意,因为它隐藏了typedef(比如
foo
)是一个结构的信息,而编写关键字
struct
并不是真正的额外工作(特别是如果那些typedef添加了后缀以指示它们是一个结构——我经常看到这种情况)


Edit:在第二个示例中添加了缺少的
typedef

查看Sedgewick的《C语言算法》一书。在这里,您可以看到很多不同的数据结构在工作。另一个有趣的阅读是来自gtk+的Gobject模型。因为在那里,他们用C语言为面向对象编程建立了一个基础设施,它的数据结构处理非常多。另一件值得一看的事情是COM模型,您可以将其转换为具有特定布局的C结构。glib包含大量有用的数据结构,例如libapr或libnspr

您可以检查几乎任何“脚本”语言,并将看到“工作中的数据结构”;-)

问候
弗里德里希(Friedrich)

很难反驳尼克·帕兰特(Nick Parlante)链表存储库的惊人之处:

对于链接列表中使用的结构,上面的链接是无与伦比的


您不想介绍的是在结构中使用函数的方面,但是如果您能通读以上内容,其他任何内容都将是轻而易举的。

您想实现什么?挑剔:定义中的结构成员以“;”not“,”结尾,谢谢您指出这一点-我将更改此内容…我想说,注释“结构的成员被称为结构名称。成员”有点误导。您使用结构\u variable.member或结构\u pointer->member;区别在于使用的是变量名称,而不是结构类型名称。另外(*pointer).member?K&R2已经过时多年了-听说过C99吗?C99对C89的改动相对较小,因此我认为K&R2仍然是回答此类介绍性问题的完美选择。此外,我认为C99并不是所有编译器都支持的。如果我错了,请纠正我。Java编译器、Fortran编译器或C89 comp都不支持它ilers,所以你没有错。但是所有C99编译器都支持它。可能有一些平台没有C99编译器,并且有一个不同语言的编译器,例如C89。嗯……你忘记了第二个代码段的关键字typedef,否则“foo”的含义就改变了。foo本身就是“struct foo”类型的变量。所以你无法仅使用“foo”声明“struct foo type”变量,因为它本身是一个变量。语句“foo variable;”甚至不会编译。