【问题标题】:Passing Structures vs Passing Variables to a Function in C将结构与变量传递给 C 中的函数
【发布时间】:2015-12-22 02:54:07
【问题描述】:

为什么要在主函数之外定义结构以便其他函数能够接收它们?我理解this answer,但是为什么在 main 函数中声明的普通变量(例如 int 和 float)可以用作函数的参数而不是 main 中定义的结构?

(PS:我问这个问题是因为我还没有足够的声誉来发表评论!)

【问题讨论】:

  • 当您说“结构”时,您是在谈论一种类型(用struct thingy {...stuff...}; 定义),还是在谈论这种类型的变量(用struct thingy myThingy; 定义?)
  • 我指的是接收结构实例的函数 - 即具有该类型的变量。
  • 那么“如果main 中定义的变量具有结构类型,为什么不能将它们传递给其他函数?”?答案是你可以!
  • 或者,如果您考虑在 main 中声明 type:差异的原因本质上是 intfloat 不是在函数内部声明。 (就像在任何函数之外声明的结构类型)

标签: c function struct scope structure


【解决方案1】:

一个词:“范围”。

如果您的结构类型定义在main() 中,那么该类型的范围是mainmain 之外的任何人都无法知道它。如果你想将它传递给另一个函数,显然该函数必须知道类型,但如果类型仅在main 中知道,那么显然该函数无法知道它。

解决方案?将类型的作用域移动到主函数和“接收”函数都可以看到的地方。

编辑:intchar 等内置类型已经具有全局范围,因此它们无处不在。我们在这里处理的是用户定义类型,其范围根据定义的位置而受到限制。

同样的规则适用于变量(也就是一个类型的实例)——一个全局变量在任何地方都是可见的(我知道,你可以用同名的局部变量“隐藏它”——我们不要分叉哦 ;-),但是main()中的局部变量只能在main()内部看到。

【讨论】:

  • 是的,但我想知道为什么这适用于 main 中定义的普通变量(例如 int x)。他们的范围不应该也仅限于 main 吗?
  • 之所以有效是因为其他类型是intrinsic,比如char, short, int, long, double, ...所以大家都知道
  • @Leponzo 您将 type 的 范围与 variable 的 范围混淆了。
  • @Leponzo 看来您也混淆了 variablestypes 的概念。像int 这样的基本类型随处可见。但是在main(或任何函数)中声明的变量只能在main 中使用——无论该变量是基类型还是结构。
【解决方案2】:

您需要了解范围原始数据类型的概念。结构不是原始类型,而是用户定义的构造,因此如果您在给定范围内定义结构,则该范围之外的程序将不会知道它,因为是您定义了它,因此它仅限于您所做的范围定义它。 Primitive data types like (int, float, char) 在语言中定义并且为整个程序所知。如果它们不是随处可用,实际上就不可能定义main() 本身,因为

int main(void)
{
    return 0;
}

main() 的这个简单定义要求 int 已经“定义”。

最后,为了能够定义结构,您还需要这些原始类型,因为您将结构定义为包含一个或多个这些原始类型的对象。您当然可以使用之前定义的结构作为结构的成员等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-12
    • 2012-01-12
    • 2021-08-28
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多