你好, 欢迎回来｡
最后我想讲的关于结构的是,
它们和函数的关系, 如何把结构作为参数传递给参数和函数, 以及这样做的效率如何｡
所以结构是函数的参数｡
在宣告名为Family的结构之后｡
在这个例子中, 我们将创建一个命名的家族, 我们如何将这个结构作为参数传递给一个函数｡
所以我们有一个叫做家庭的结构｡
这里有一堆字符数组, name,
father, mother, 然后是int, age.
这就是我们的结构定义｡
我们知道它是一个结构, 因为struct关键字在那里, 后面跟着标记名,
我们有花括号等等｡
现在我们如何将这个结构传递给一个叫做siblings的函数呢？
你可以像声明结构一样, 把类型作为参数名.
很简单｡ 所以在这个例子中, 我们有布尔兄弟｡
同级正在返回布尔值｡
它有两个参数, 两个结构体参数｡
您必须识别属于类型结构族的结构类型｡
现在在更高级的c中, 你可以在这个结构体上做一个typedf, 然后给它命名, 你可以在这里缩短这个名字,
但是我们还没有讨论typeds｡
那样可能会更好｡
但这才是你真正需要做的｡ 您必须定义整个类型,
即struct family, 然后是变量名, 就像任何其他参数一样｡
这里我们传入两个参数, 成员1和成员2｡
它们都属于类型结构族｡
然后在函数内部, 如果我们想访问成员, 就像正常访问成员一样.
成员1和成员2, 它们不是指针, 所以我们不使用破折号, 然后大于,
我们只对指针这样做, 因为我们需要解引用它们, 看看它们指向什么｡
因为它们不是指针, 我们可以直接用点｡ 成员一点妈妈成员二点妈妈｡
成员一点母和母二点母都是字符数组, 字符数组本质上是指针｡
所以我们可以将它们传递给str compare｡ 如果相同的话,
比较结果会是相等的, 我们现在要做的就是检查成员一的母亲和成员二的母亲是否相同.
如果是的话, 我们就返回true｡
因为如果他们两个都有相同的名字,
而且这真的是姓氏, 那么他们是兄弟姐妹｡
很简单｡
只要函数声明中包含该类型的结构, 就可以轻松地将参数传递给函数｡
所以这个函数, 同样, 有两个参数, 每个参数都是一个类型族的结构｡
如果我们想把指向结构的指针作为函数参数呢？
我之前提到过, 这样做更好,
因为我们是按值和c传递的｡
当您确实以传值方式传递时, 就是复制｡
如果你有一个包含大量数据的结构,
大量的大型结构作为参数, 你必须把这个结构中的所有内容复制到实际的函数中｡
所以复制这些大型结构可能需要一些时间｡
如果你有一个指针, 你所要做的就是复制地址,
这样会快得多｡
因此, 指向结构的指针被用作参数和函数,
以避免内存消耗和复制所有结构所花费的时间｡
现在如果你有一个小的结构,
没什么大不了的, 但是你肯定想使用大的指针和结构｡
那么在这种情况下, 你怎么做呢, 你还是指定结构类型的名称, 你只要把星号预先加上,
非常简单｡
如果你不想改变结构中的任何数据, 你可以在结构类型前使用constant｡
如果不希望地址发生变化, 可以将常量放在结构族指针之后｡
但在这里, 我们在做同样的事情｡
但是现在我们要用不同的方式来访问它因为现在它是一个指针, 我们可以用破折号大于,
这个新的符号来访问, 而不是用点｡
我们不必在这里使用点｡
因为要记住, 指针必须先解引用,
所以你必须把它放在括号里, 解引用指针的语法要比把点放在括号外更好,
因为它有更高的优先级, 使用破折号比使用大于更容易.
短划线和大于母,
短划线和大于母, 它们都是指针, 可以在字符串比较中传递.
如果它们相同, 则返回true｡ 否则, 还假, 挺直白的｡
如果您不想允许对结构的成员进行任何修改, 也可以使用我提到的const修饰符｡
结构体所指向的内容然后把const放在指针前面｡
你也可以把财产放在家庭之前｡
在这种情况下, family有一个类型f｡
所以这里实际上是构造族或者结构族常量指针｡
然后再以同样的方式访问, 你没有修改任何东西｡ 所以你可以走了｡
编译器不会抱怨｡
如果您不想允许对地址本身进行任何修改, 也可以使用常量修饰符｡
任何更改这些结构的尝试都将导致编译期间出现错误消息｡
所以这里你会说家族星星, 你把常数放在星后面｡
这意味着你不能改变p成员的值,
指针的值, 也就是地址｡
但同样,
这也不是很有用, 因为当你传值时, 你实际上是在传递地址的副本｡
所以这是多余的, 你不需要这样做, 但你可以｡
在这里, 你需要改变p成员的地址｡
在这种情况下, 您只是访问数据, 看看它们是否相等｡
现在, 每个参数定义中的间接运算符都位于constant关键字之前｡
那个星号, 它不在参数名前面｡
您不能修改存储在指针中的地址, 因为它在星号之后｡
如果它是在参数名类型前面, 那么你希望能够修改它实际指向的东西｡
如果我们在参数名前面有一个间接操作符, 在它前面的常量中, 这就意味着你想修改它指向的内容.
这只是说地址｡
因此, 您无法修改存储在指针中的地址｡
这里保护的是指针,
而不是指针所指向的结构, 就像常量和其他指针参数一样, 与结构体没有区别.
如果你想从一个指针函数返回一个结构, 函数原型必须在声明中以正常的方式指示这个返回值｡
所以在这里你不得不说罢工日期我的有趣的指针或不指针, 这并不重要｡
这是一个不带参数的函数的原型, 它返回一个日期类型的结构, 从函数返回一个结构非常容易｡ 而这又有什么价值｡
好了, 现在我们可以从一个函数中返回多个元素或数据项｡
如果你返回一个结构体, 你可以返回10个值, 10个不同的数据项｡
那多酷啊｡ 该结构允许您从函数返回多个值｡
非常非常有价值｡
因此, 返回指向结构的指针通常比只返回结构更方便｡
当你返回一个指向结构的指针时, 它是在堆上创建的,
因为所有的指针都是在堆上创建的｡
这意味着它将存在更长一段时间｡
这意味着您可以在任意时间删除和管理它｡
在这个例子中, 我们创建了一个名为funds的结构体｡
它包含一个名为bank的字符数组, 包含一个double, 另一个名为saved的特定长度的字符｡
只是假设乐趣长度等于50｡
然后它有一个双保存的｡
我们有一个叫做sum的函数, 它把这个结构作为一个参数｡
我们所做的就是在里面返回第一个结构中的银行资金加上保存资金, 这将返回他们在银行中的金额｡
在这个例子中, sum只是一个双精度数｡
我们不会传回指标｡ 我们只是把一个指针作为参数｡
在主函数中, 我们创建了一个结构变量stan of
struct funds.
我们用一些值初始化它, 然后打印出调用sum的总数｡
我们就像传递变量一样传递这个结构｡
我们不需要取消引用它, 它不是指针｡ 我们不必真的做什么特别的事｡
我们只需要确保在函数声明中我们有那个结构类型, 但是其他的一切看起来都很正常｡
几个提醒｡
我在前面提到过, 在将结构传递给函数时, 应该始终使用指针｡
为什么？
因为请记住, 旧版本的c不允许传递结构, 但它们允许传递指针｡
因此可以避免任何类型的向后兼容性｡
如果你使用的是旧版本的c, 你的程序还是可以运行的｡
因此,
由于时间复制, 仅传入单个地址也更有效｡
但是如果你这样做了,
如果你传入了一个参数, 这个参数是一个指向函数内部结构体的指针, 它对你的数据的保护就少了｡
因此, 被调用函数中的某些操作可能会无意中影响原始结构中的数据｡
这就是您要使用const限定符的地方｡
你应该在实际类型之前使用const, 而不是在星号之后和参数名之前, 在类型之前｡
传递结构的优点是参数, 函数使用原始数据的副本｡
这比使用原始数据更安全｡
所以这是唯一一次你想把一个结构作为一个非指针的参数来传递｡
而且编程风格趋于更清晰一点｡
与传递结构化指针作为参数相比, 传递结构化指针作为参数的主要缺点是, 旧的实现可能无法处理代码,
这浪费了时间和空间, 尤其是当你有大的结构时,
我们必须为每个成员做大量的复制｡
所以请记住这一点｡
在大多数情况下,
您希望传递指向结构的指针, 这样效率更高, 也更节省时间｡
为了提高效率, 程序员使用结构指针作为函数参数, 并且在必要时使用常量｡
这就是你要做的组合｡
如果你担心保护问题,
就使用函数指针来提高效率, 然后使用const const,
这样函数内部就不会出错, 就像普通的指针一样, 但是指针的效率更重要, 因为它的结构很大｡
通过值传递结构最常用于小型结构, 而这些正是您需要考虑的规则｡
只要结构不是指针, 只要它很小, 就可以传递它｡
同样,
一些重要的概念与结构和将指针作为参数传递, 变元和返回指针以及｡
现在, 我们可以开始实施其中的一部分｡ 我们提供了许多例子｡ 我们理解这些概念｡ 我们了解语法｡
现在我想给你们几个挑战, 让你们真正做到这一点,
你们记住语法了吗, 如果你们想在程序中创建一个结构, 你们知道怎么做, 就像你的手背一样｡
在接下来的几节课里,
我们会有一些挑战, 让你们熟悉我们讲过的, 关于结构的内容.
-谢谢—谢谢