2014-01-06 58 views
-1

我一直试图理解C语言中的结构体的用法,以便更好地理解编程概念,而结构体对我来说有些困惑;很容易学习语法,但很难确定为什么以及何时使用它们,我相信结构只是C编程语言中的一个工具,因为它看起来像你可以完成任何你想要的东西,而不必真的使用结构。再次,这是我认为迄今为止,因为我没有完全理解它们。可以将结构体与散列表或字典进行比较

除了用结构创建一个唯一的数据类型结构和散列/字典之间的区别是什么?

选择结构的主要好处是什么?

将结构思考为散列或字典是否有意义?

再次,我只是想有关于结构的概念更好地了解C.

感谢

+6

请选择一种语言来询问C或C++。他们是不同的语言,结构不同。在C中,它们只是数据。在C++中,它们可能具有活动组件(方法)和更复杂的语义。如果您需要询问两种语言,请使用单独的问题。当您决定后,请删除其他标签并编辑问题以指定语言。 –

+2

认为某些功能没有用处在新学习者中很常见。我听到一些朋友说我的OOP没用,或者设计模式没用,甚至指针和回调都没用。如果你这样想,是因为你还没有克服任何大规模的编程问题。请记住,任何流行的编程语言中的每个功能都有其意义,因为它们的创建者不是白痴,相反,他们是天才。 – TwilightSun

+0

@TwilightSun:我完全和你在一起,直到你说*每个*功能都有意义。有些功能被广泛认为是错误的,或者明确表示只是因为向后兼容才存在。 – ruakh

回答

6

是否有意义去想结构作为哈希或字典?

不,他们都不是。引入哈希/字典只会混淆水;实际上,C和C++都不提供散列/字典(尽管C++标准库提供了一些使用散列的容器,而映射可称为“字典”)。

在C++中,结构是类,所以你应该问的问题是“什么是类的好处?”

回答这个问题可以很容易地找到在互联网上,并在C++的书(我建议你现在阅读!),但是,简单地说,类:

  • 组数据合并到一个对象
  • 组操作
  • 允许安全

封装在最简单的层面上,问自己你是否会想围绕10整数传递给大量的功能,重复,邻r将它们分组为一个对象并发送该对象。

在C中,数据分组几乎都是从结构中获得的,但这仍然非常有用。

1

考虑一个程序,该程序保存学校的学生列表。学生将有姓名,地址,出生日期,他们参加的班级等等。你可以把这些东西放在单独的容器中(可能是哈希表或平衡二叉树,如果它们没有太大改变,则是排序后的数组)键入他们的学生ID,但是你必须单独找到他们并访问大量的内存页面以获取单个学生的所有信息。使用结构,可以有效地说“将所有这些信息存储在一起”,然后将这些字段的结构放入数组或散列表中的单个位置。

在C++中它们更强大,因为您可以使用面向对象/定向编程来强制人们使用特定的一组函数来与数据进行交互,这有助于保持它 - 甚至是结构之外的相关数据 - 保持一致,有效的状态。 (OOP也有其他功能,但这是这里最相关和最基本的)。

+0

谢谢大家的好解释,它开始有意义,我认为我已经阅读了足够的理解,但不是,我会深入研究它。非常感谢。 –

2

C/C++中的结构体/类和散列表/字典之间存在概念上的相似性。在这两种情况下,值都与“键”相关联,并且可以使用“键”值进行访问。然而,这两件事在一个非常重要的方面是不同的:

结构/类映射数据和函数(无论是通过指针还是方法)数据到编译代码的用户提供的键值,直接或间接。

这种区别的结果是,编译器在编译时用内存地址和偏移量替换程序员提供的标识符 - 在动态分配对象的情况下稍微复杂一点。已编译代码的用户无法添加或删除结构/类的成员。就散列表/字典而言,编译代码的用户通常可以添加和删除成员 - 尽管并非总是如此,具体取决于程序员提供的内容 - 并且在运行时更新各种散列或索引方法以更新或访问哈希表/字典的成员。

尽管存在概念上的相似性,但程序员在使用C或C++中的任何一种机制时都试图开发出非常不同的解决方案,并且几乎从不会遇到需要在结构/类或散列表/字典之间进行选择的情况。每种方法的需求和用例都有很大的不同,以确保这种选择在实践中不会给程序员带来麻烦。

相关问题