有人能为我提供一个非常好的C语言结构教程吗?
我已经进行了谷歌搜索,但我找到了正常的信息。我正在寻找详细的结构。请告诉我。
答案 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/
对于在链表中使用的结构,上述链接是无与伦比的。
你不会涵盖在结构中使用函数的方面,但如果你可以通过上面的内容,其他任何东西都将是轻而易举的。