2015-12-22 146 views
-2

为什么应该在主函数之外定义结构以便其他函数能够接收它们?我明白了this answer,但为什么在main函数中声明的普通变量(例如int和float)可能被用作函数的参数,而不是主函数中定义的结构呢?传递结构与将变量传递给函数C

(PS:我问这个问题,因为我还没有足够的信誉评论)

+0

当你说“的结构”,你说的是一型('结构啄{...东西...}定义;'),或者是你在谈论与该类型变量(用'结构定义thingy myThingy;'?) – immibis

+0

我指的是接收结构实例的函数 - 即具有该类型的变量。 – Leponzo

+0

所以“为什么你不能将'main'中定义的变量传递给其他函数,如果它们具有结构类型?”?答案就是你可以! – immibis

回答

2

一个字:“范围”。

如果你的结构类型定义在main()那么类型的范围是mainmain之外没有什么可以知道它。如果你想将它传递给另一个函数,很明显这个函数必须知道类型,但是如果仅在main中知道该类型,那么显然该函数无法知道它。

解决方案?将类型的范围移到main和“receiving”函数都可以看到的地方。

编辑:内置类型如int,char等已经具有全球范围,所以他们都知道无处不在。我们在这里处理的是一个用户定义类型,其范围根据其定义的位置而受到限制。 (我知道,你可以用一个同名的本地“隐藏它” - 不要分割头发呃;-) ,但main()中的局部变量只能在main()内看到。

+0

是的,但我想知道为什么这对于在main(例如int x)中定义的正常变量有效。它们的范围不应仅限于主体吗? – Leponzo

+0

简短的回答否:观看编辑。 – John3136

+0

它工作的原因是其他类型是_intrinsic_,比如'char,short,int,long,double,...'所以每个人都知道他们 –

0

您需要了解范围原始数据类型的概念。结构不是原始类型,而是用户定义的结构,所以如果你在一个给定的范围内定义一个结构,它就不会被该范围之外的程序知道,因为它是你定义它的,因此它被限制在你所做的范围内定义它。 Primitive data types像在语言中定义(intfloatchar)并且已知整个程序。如果他们不是随处可得,它实际上是不可能的定义main()本身,因为

int main(void) 
{ 
    return 0; 
} 

这种简单的main()定义需要int是“定义”了。

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