你好, 欢迎回来｡
让我们继续讨论结构, 并讨论它们与数组的关系｡
我们讨论了结构和数组的相似之处, 你可以存储不止一个值,
但它们是不同的, 因为你可以有不同的数据类型, 你可以用这种方式对它们进行分组｡
但你也可以有类似的结构数组｡
所以你已经看到了结构是多么的有用, 它使你能够逻辑地将相关的元素组合在一起, 我们已经看到了｡
我们知道如何使用struct关键字和标记名来定义一个包含不同元素的结构｡
我们还知道如何创建这种类型的变量｡
因为结构本质上是一种你可以使用的新的数据类型｡
然后, 您可以使用成员选择运算子存取结构的元素｡
如果你想在一个数组中创建多个结构, 那该怎么办｡
你能做到的
例如, 对于程序使用的每个日期,
只需要跟踪一个变量而不是三个变量, 这就是结构的优点｡
如果我们想在一个程序中处理10个不同的日期,
我们只需要跟踪10个不同的变量, 而不是30个｡
因为记住, 这个结构本身包含了三个变量｡
对于不同的变量, 10仍然是一种很多,
所以这真的不是最优的方式｡ 您可能需要创建一个数组｡
因为你会有10个相同的类型就像你会有10个相同的整型一样｡
只有一种结构类型｡
因此, 处理这10个不同日期的更好方法涉及到c编程语言的两个强大特性的组合, 结构和数组｡
您可以将它们结合使用, 使其功能更加强大｡
所以定义一个结构数组是完全有效的,
结构数组的概念在c中是非常强大和重要的, 所以要特别注意｡
声明结构数组就像声明任何其他类型的数组一样｡
您指定的类型恰好是结构类型｡
所以如果你想创建一个名为date的结构数组, 你可以说struct date,
然后是变量名,
然后用括号括起来, 就像其他数组用括号括起来一样, 你必须指定大小.
所以在这个例子中, 如果我们创建了10个实例, 或者10个日期结构体类型的元素,
我们会说10在那些括号里.
这将定义一个名为my dates的数组, 它由10个元素组成｡
数组内的每个元素都定义了一个bf类型的struct date,
它包含三个成员｡
因此, 实际上,
你要做的是存储30组不同的数据, 30个不同的数据元素｡
若要识别结构数组的成员, 您可以套用与个别结构相同的规则｡
使用点运算符对结构名称进行归档, 然后使用成员名称进行归档｡
引用数组中的特定结构元素是很自然的｡
要将my dates数组中的第二个日期设置为1986年8月8日, 您只需指定数组的名称my
dates, 并指定索引｡
我们在这里指定第二次约会｡
请记住, 数组是以0为基底的｡ 所以我们说1, 小于1｡
然后如果我们想访问数组元素的元素或者那个元素的结构体的成员,
我们说. month｡
这将给予my dates数组中的第二个元素｡
该结构体类型的month值, 这里我们给它赋值8.
如果要访问日期, 我们还将分配日期8,
因为它是8月8日｡ 最后, 对于年份,
我们会说点年份等于1986年｡
这就是你如何给my dates数组的第二个元素赋值, 三个不同的变量, 因为它的类型是struct,
date struct.
你应该注意到其实没什么不同｡
这里唯一的区别是你有一个点｡ 通常情况下,
你只需要说my dates sub-1就可以了, 因为你只能根据数组的类型赋一个变量｡
但是在这个例子中, 你可以用三个不同的变量来表示sub-1,
因为这三个变量是结构体中的三个元素｡
初始化结构数组｡
包含结构的数组的初始化类似于多维数组的初始化｡
请记住, 对于多维数组,
我们将遵循特定的语法, 在外部使用花括号, 然后在内部使用花括号来表示每一行｡
里面的花括号实际上是可选的, 但它使它更具可读性｡
所以我喜欢遵循这个惯例｡
在这个例子中, 我们创建了一个my dates类型的结构date,
它的大小为5｡ 然后我们只初始化前三个元素｡
就像一个多维数组, 里面有花括号｡
所以my dates数组中的第一个元素是一个小于零的索引｡
我们假设月份是12, 日期是10, 年份是1975｡
然后我们对第一个元素做同样的操作｡ 1980年12月30日｡
对于第三个元素, 我们将说11152005｡
因为我们没有在my
dates数组中提供另外两个元素, 所以它们不会被初始化｡
这将设置前三个日期｡
在数组中, 我的日期为12 10 1975､
12 30 1980和11 15 2005｡
大括号的内部句点是可选的, 就像在多维区域中一样, 也是可选的｡
但它同样使它更容易阅读, 更容易遵循那些内部括号, 我会遵循这个惯例｡
如果你想去掉大括号,
你可以这么做, 但是这有点难理解,
因为现在你只有逗号, 用逗号分隔, 或者用逗号分隔元素,
如果你做了很多这样的事情, 会很混乱｡
你必须正确地映射它, 比如说我在第四个元素中,
第四个逗号,
这是数组的第二个元素, 这比较难理解, 所以用花括号里面的｡
如果您只想将数组的第三个元素初始化为指定值, 则可以指定my dates
sub-5｡
您仍在此处创建数组｡
您仍然声明了变量并将大小设置为5｡
但是在花括号里面, 你说的是括号里面的两个你要把2初始化为12 10
1975｡
你会看到方括号代表你要初始化的元素, 然后是赋值运算符equals,
在花括号里你要初始化结构体中元素的月,
日, 年.
因此, 您也可以精确地指定要初始化的元素｡
如果您只想将my dates数组的第二个元素month和day设置为12和30, 您可以执行非常类似的操作｡
您只需用逗号分隔每个属性｡
你不想设置年份, 所以你想使用那些花括号｡
你可以说.月等于12减1.日等于30｡
同样, 这种语法看起来与其他地方的初始化结构变量非常相似｡
这里唯一的区别是因为它是一个数组, 你必须指定数组的索引, 但是语法相似｡
那么包含数组的结构呢？
结构内包含数组的元素｡
还可以找到包含数组作为成员的结构｡
这可能有用｡
它最常见的用法是在结构中设置字符数组｡
我们使用字符数组非常适合字符串｡
因此, 结构包含字符串（本质上是字符数组）是非常常见的｡
因此, 假设您要定义一个名为month的结构,
该结构包含作为其成员的月份中的天数以及月份名称的三个字符缩写｡
这就是我们可以使用字符数组的地方｡ 我们可以说结构月｡
我们知道如何定义结构｡ 同样, 这并不是分配任何内存｡
这就是结构的定义方式｡ 这些是包含在其中的元素｡
这里我们使用struct关键字｡ 我们说出结构体的名称｡ 标记名是month,
然后我们有左花括号, 然后我们指定元素｡
我们有一个整数元素, 它代表天数, 最后是分号｡
然后我们有一个字符数组,
字符名为sub-three, 所以大小为3, 因为它有三个字符｡
然后我们用分号中的右大括号结束这个结构｡
但是要记住, 字符是数组, 它们和指针有着密切的关系, 我们现在已经知道了｡
但是, 只要将数组作为成员元素, 就可以轻松地让结构包含数组｡
这就建立了一个月份结构,
其中包含一个名为number of days的整数成员和一个名为name的字符成员｡
成员名称实际上是一个由三个字符组成的数组, 非常简单｡
那么, 您实际上如何访问它呢？ 首先你必须创建变量｡
变量会为结构体中的元素创建内存, 然后你只需要在8个月的变量中设置合适的字段, 字符数组,
因为这是它的名字.
我们有名字和天数｡ 在这里它被称为名称, 在这个例子中它被称为月份｡
month是变量类型, name是元素类型, 这是正确的.
所以这里我们创建一个结构体｡ 它的类型为month｡
它的变量名是月｡ 我们不初始化它｡
我们立即设定一个月的天数为31天｡
我们使用带点成员选择操作符｡
然后我们要给字符数组赋值, 我们不能直接给字符数组赋值.
如果你想签署所有的东西, 你必须做一个字符串比较或其他什么｡ 你也可以这么做｡
您不必使用这些索引｡ 你可以说str
copy a month, dot
name, comma, 然后用双引号括住j a n,
或者你也可以这样做, 通过索引访问数组的元素｡
这里我们使用month. name,
因为我们必须访问name成员变量或成员元素｡
然后在括号内指定数组的索引｡
我们会发现它在数组j中的第一个字符上签名, 第二个是a, 第三个是n.
如果你在处理整型､ 双精度和浮点数,
你会看到这种语法｡ 通常,
当你有一个字符数组时, 你将使用str stir copy函数, 并给所有的字符赋值, 并加上双引号｡
您也可以在宣告变数时, 执行非常类似的动作,
将变数初始化为相同的值｡
就在花括号里面, 因为它是一个数组,
你可以在里面的花括号里, 然后在每个字符周围加上单引号｡
您可以在数组中设置12个月份结构来表示一年中的每个月份｡
现在我们可以创建一个month变量, 它是一个struct month类型的数组, 大小为12,
它可以表示每个月份｡
然后对于每个月, 我们可以用天数和月份的缩写来表示｡
因此, 利用数组和结构这两个强大的概念是非常非常有用的｡
结构可以有许多元素, 因此它们实际上可以是数组的结构, 而结构内的元素可以是数组｡
接下来我们将讨论如何使用结构来包含其他元素, 比如指针｡
但是您将看到, 结构可以将任何类型的数据存储在许多不同类型的数据中｡
它在数组概念中非常有用｡
我希望这对你有帮助｡ 同样,
我们将面临演示其中一些概念的挑战, 并在稍后的代码块中提供一些示例｡
-谢谢—谢谢