2015-12-22 145 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是「定義」了。

最後,爲了能夠定義,因爲你定義一個結構爲包含一個或多個這些原語的一個對象,你也需要這些基本類型結構。您當然可以使用之前定義的結構作爲結構的成員等等。