6

谁能给我一个很好的C结构教程?

我已经进行了谷歌搜索,但我找到了正常的信息。我正在寻找详细的结构。请告诉我。

4

7 回答 7

8

您可以随时阅读Brian W. Kernighan 的教程,非常好。至于“细节”究竟是什么意思?毕竟,结构相当简单。上面的链接涵盖了常见的问题、类型定义、结构指针等。如果您仍然不清楚结构,也许您应该尝试发布一些更具体的问题。

于 2009-02-15T16:41:28.303 回答
5

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

struct Point location;

正因为如此,你会经常看到它们用如下的 typedef 声明:

typedef struct tagPoint {
    int x;
    int y;
    } Point;

然后你可以像其他类型一样声明一个点:

Point location;

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

于 2009-02-15T16:52:41.300 回答
3

我通常建议(并且总是被建议)使用官方指南。对于 ANSI C,您无法获得比K&R2更详细官方的信息。

于 2009-02-15T17:19:07.837 回答
1

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

struct foo {
    int a;
    char b;
    int c;
    char d;
}

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

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

typedef struct foo {
  int a;
  int b;
} foo;

这使得可以使用

struct foo variable;

或者

foo variable;

用于声明类型的变量struct foo

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

编辑typedef:在第二个示例中添加了缺失。

于 2009-02-15T21:31:45.983 回答
1

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

插图:

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 编程语言,第 2 版(Prentice Hall 软件)

  • 优秀的结构介绍
于 2009-02-15T16:47:54.027 回答
0

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

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

问候弗里德里希

于 2009-02-17T13:22:47.547 回答
0

很难反驳 Nick Parlante 的链表存储库的厉害之处:

http://cslibrary.stanford.edu/

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

您不会涉及的是在结构中使用函数的方面,但是如果您能理解上述内容,那么其他任何事情都会变得轻而易举。

于 2013-03-13T12:16:34.423 回答