关于C中结构的详细教程

时间:2009-02-15 16:25:43

标签: c structure

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

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

7 个答案:

答案 0 :(得分:8)

你总是可以阅读Brian W. Kernighan's Tutorial,这是非常好的。至于“细节”究竟是什么意思?毕竟,结构相当简单。上面的链接涵盖了常见的问题,typedef,指向struct的指针等。如果你还不清楚结构,也许你应该尝试发布一些更具体的问题。

答案 1 :(得分:5)

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

struct Point location;

因此,您经常会看到使用类似这样的typedef声明它们:

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

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

Point location;

当您第一次看到它时,这种表示法可能会令人困惑。

答案 2 :(得分:3)

我通常建议(并且总是建议)使用官方指南。对于ANSI C,您不能再获得详细官方而不是K&R2

答案 3 :(得分: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 Programming Language, 2nd Edition (Prentice Hall Software)

  • 优秀的结构介绍

答案 4 :(得分:1)

正如其他人已经说过的,结构只是一组变量。根据您的目标,如果您想通过低级函数(带指针算术)访问元素,可能需要考虑填充或打包:结构元素通常在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 foo {
  int a;
  int b;
} foo;

这样可以使用

struct foo variable;

foo variable;

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

从我的观点来看,解释一个结构是一个坏主意,因为它隐藏了typedef(如foo)是一个结构的信息,并且编写关键字struct并不是真的额外的工作(特别是如果那些typedef添加了一个后缀来表明它们是一个结构 - 我经常看到这个)。

修改:在第二个示例中添加了遗失typedef

答案 5 :(得分:0)

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

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

此致 弗里德里希

答案 6 :(得分:0)

很难反对Nick Parlante的链表库的真棒:

http://cslibrary.stanford.edu/

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

你不会涵盖在结构中使用函数的方面,但如果你可以通过上面的内容,其他任何东西都将是轻而易举的。