課程
/后端開發
/C
/C語言入門
幾種類別的區別,完全看不懂。
2018-07-03
源自:C語言入門 5-11
正在回答
auto自定義變量,默認的
register寄存器變量,是形參和自動變量,靜態局部變量不能定義為寄存器變量
extern外部變量,我覺得就是全局變量
static靜態變量,在局部靜態變量中,該變量只能賦值一次,而且不釋放(下一次調用,變量的值為上一次結束時的值)
自動型變量(以下內容均來自百度)定義一個內部變量時,如果將auto加在定義語句前面,則該變量是自動型變量;定義內部變量時,如果沒有加任何存儲類型限定,該變量默認為自動型變量。auto只能修飾內部變量,不能修飾外部變量。也就是說只有內部變量可以定義為自動型變量,外部變量不能定義為自動型變量。事實上,auto沒有什么實際用處。內部變量已經默認為自動型變量。2.靜態型變量外部變量和內部變量都可以定義為靜態型變量。如果在定義一個內部變量時,在定義語句最前面加上static存儲類型限定詞,那么該變量將是一個靜態型變量。該變量將在靜態數據區分配存儲空間。這種變量作用域雖然只在函數內部,但是該變量將一直在靜態數據區占據存儲空間,直到程序運行結束。定義外部變量時,如果不加存儲類型限定詞,它將在靜態數據區分配存儲空間。它的作用域除了本文件以外,其他文件通過extern語句聲明后也可訪問。但是,如果在定義一個外部變量時,加上static限定詞,其作用域將變窄,該變量只在本文件中可見,在其他文件中將不可見,此時在其他文件中即使用extern聲明也不能擴展其作用域。這是一個外部靜態型變量,也在靜態數據區分配存儲空間。注意:對于函數的作用域也是這樣,如果在函數定義時加上了static限定詞,那么該函數也只在其定義文件內可見(“可見”的意思就是在在該范圍內可以使用)。在其他文件中即使聲明了也不可以調用。另外,對于函數聲明而言可以省略extern關鍵字。一個文件中加了static的同名外部變量將隱藏其他文件中定義的未加static的外部變量。也就是說,static變量能夠屏蔽其他文件中的同名外部變量,這功能有點像函數的內部變量能夠屏蔽同名的外部變量一樣。但是,不同文件中如具有未加static的多個同名外部變量則是非法的。static限定詞常用于外部變量,也可用于函數。正常情況下,函數名字是全局的,對程序的任何部分都是可見的。如果在定義一個函數時用static限定,該函數將在其定義文件以外不可見。static限定詞同樣能夠應用于內部變量。此時,該變量將是一個內部靜態型變量。內部靜態型變量就像自動變量一樣是屬于某個特定函數的內部變量。但是,同自動型變量不同,它們一直在內存中存在,而不是隨著函數的每次調用而存在,隨著函數調用結束而消失。這意味著內部靜態型變量提供了單個函數內部私有的、持久的存儲。也就是說內部靜態型變量只在函數被調用時起作用,但是它將在程序的整個運行時間內一直占據內存空間。3.寄存器型變量register限定詞通知編譯器--程序中的變量將頻繁使用。它的意思是建議編譯器將程序中用register限定的變量放置在計算機的內部寄存其中,這樣可能得到更小更快的程序。但是,編譯器將根據實際情況考慮是否采納該建議--是否將register變量處理為寄存器變量最終決定權還是在編譯器。如下使用register:register int x;/*x必須是內部變量*/register char ch;/*ch必須是內部變量*/register只能用于限定自動型變量和函數的形式參數。也就是說register只對內部變量起作用,而且只能限定內部非靜態型變量,不能限定內部靜態型變量。register也可以應用于形式參數,格式如下:f(register unsigned m,register long n) /*register應用于形式參數*/{ ? ? register int i; /* register應用于內部變量*/}在傳統C中,register變量的使用有諸多限制,它決定于硬件的實現方式。在每一個函數中只有少數幾個變量可以保存在寄存器中,而且也只有特定的類型才行。過量的register變量看起來是無害的,但是超量以后,編譯器將忽略新的register變量。另外不管register變量實際上是否被編譯器設置為寄存器型變量,都不可能取得該變量的地址。寄存器型變量的類型和數量的多少隨計算機不同而異。register變量一般只能夠設置幾個。傳統C的register類型限定于char、int等類型。像float、double、數組等是不可以設定為register型變量的。但是,在最新C99標準中,任何類型都可以定義為register變量,register聲明的目的只是告訴編譯器以盡快的速度處理該變量,編譯器不見得非把它處理為register變量。4.外部型變量如extern用于變量定義語句前面,那么該語句就只能是一個聲明語句了,他不再是一個變量定義語句。它僅僅是一個聲明--聲明該變量已經在別的地方定義,只是告訴編譯器該變量的類型。extern int sp;/* sp在別的地方定義,并分配存儲單元,本語句只是聲明它已經定義過*/該語句聲明了sp在別的地方已經定義,并分配了存儲空間,本語句只是說明sp已經定義過的類型為int,并不再為它分配內存空間。這樣聲明以后,在本文件余下部分就可以使用sp了。1.自動型變量定義一個內部變量時,如果將auto加在定義語句前面,則該變量是自動型變量;定義內部變量時,如果沒有加任何存儲類型限定,該變量默認為自動型變量。auto只能修飾內部變量,不能修飾外部變量。也就是說只有內部變量可以定義為自動型變量,外部變量不能定義為自動型變量。事實上,auto沒有什么實際用處。內部變量已經默認為自動型變量。2.靜態型變量外部變量和內部變量都可以定義為靜態型變量。如果在定義一個內部變量時,在定義語句最前面加上static存儲類型限定詞,那么該變量將是一個靜態型變量。該變量將在靜態數據區分配存儲空間。這種變量作用域雖然只在函數內部,但是該變量將一直在靜態數據區占據存儲空間,直到程序運行結束。定義外部變量時,如果不加存儲類型限定詞,它將在靜態數據區分配存儲空間。它的作用域除了本文件以外,其他文件通過extern語句聲明后也可訪問。但是,如果在定義一個外部變量時,加上static限定詞,其作用域將變窄,該變量只在本文件中可見,在其他文件中將不可見,此時在其他文件中即使用extern聲明也不能擴展其作用域。這是一個外部靜態型變量,也在靜態數據區分配存儲空間。注意:對于函數的作用域也是這樣,如果在函數定義時加上了static限定詞,那么該函數也只在其定義文件內可見(“可見”的意思就是在在該范圍內可以使用)。在其他文件中即使聲明了也不可以調用。另外,對于函數聲明而言可以省略extern關鍵字。一個文件中加了static的同名外部變量將隱藏其他文件中定義的未加static的外部變量。也就是說,static變量能夠屏蔽其他文件中的同名外部變量,這功能有點像函數的內部變量能夠屏蔽同名的外部變量一樣。但是,不同文件中如具有未加static的多個同名外部變量則是非法的。static限定詞常用于外部變量,也可用于函數。正常情況下,函數名字是全局的,對程序的任何部分都是可見的。如果在定義一個函數時用static限定,該函數將在其定義文件以外不可見。static限定詞同樣能夠應用于內部變量。此時,該變量將是一個內部靜態型變量。內部靜態型變量就像自動變量一樣是屬于某個特定函數的內部變量。但是,同自動型變量不同,它們一直在內存中存在,而不是隨著函數的每次調用而存在,隨著函數調用結束而消失。這意味著內部靜態型變量提供了單個函數內部私有的、持久的存儲。也就是說內部靜態型變量只在函數被調用時起作用,但是它將在程序的整個運行時間內一直占據內存空間。3.寄存器型變量register限定詞通知編譯器--程序中的變量將頻繁使用。它的意思是建議編譯器將程序中用register限定的變量放置在計算機的內部寄存其中,這樣可能得到更小更快的程序。但是,編譯器將根據實際情況考慮是否采納該建議--是否將register變量處理為寄存器變量最終決定權還是在編譯器。如下使用register:register int x;/*x必須是內部變量*/register char ch;/*ch必須是內部變量*/register只能用于限定自動型變量和函數的形式參數。也就是說register只對內部變量起作用,而且只能限定內部非靜態型變量,不能限定內部靜態型變量。register也可以應用于形式參數,格式如下:f(register unsigned m,register long n) /*register應用于形式參數*/{ ? ? register int i; /* register應用于內部變量*/}在傳統C中,register變量的使用有諸多限制,它決定于硬件的實現方式。在每一個函數中只有少數幾個變量可以保存在寄存器中,而且也只有特定的類型才行。過量的register變量看起來是無害的,但是超量以后,編譯器將忽略新的register變量。另外不管register變量實際上是否被編譯器設置為寄存器型變量,都不可能取得該變量的地址。寄存器型變量的類型和數量的多少隨計算機不同而異。register變量一般只能夠設置幾個。傳統C的register類型限定于char、int等類型。像float、double、數組等是不可以設定為register型變量的。但是,在最新C99標準中,任何類型都可以定義為register變量,register聲明的目的只是告訴編譯器以盡快的速度處理該變量,編譯器不見得非把它處理為register變量。4.外部型變量如extern用于變量定義語句前面,那么該語句就只能是一個聲明語句了,他不再是一個變量定義語句。它僅僅是一個聲明--聲明該變量已經在別的地方定義,只是告訴編譯器該變量的類型。extern int sp;/* sp在別的地方定義,并分配存儲單元,本語句只是聲明它已經定義過*/該語句聲明了sp在別的地方已經定義,并分配了存儲空間,本語句只是說明sp已經定義過的類型為int,并不再為它分配內存空間。這樣聲明以后,在本文件余下部分就可以使用sp了。
舉報
C語言入門視頻教程,帶你進入編程世界的必修課-C語言
2 回答變量存儲類別
3 回答變量存儲類別
1 回答變量存儲類別
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2018-07-09
auto自定義變量,默認的
register寄存器變量,是形參和自動變量,靜態局部變量不能定義為寄存器變量
extern外部變量,我覺得就是全局變量
static靜態變量,在局部靜態變量中,該變量只能賦值一次,而且不釋放(下一次調用,變量的值為上一次結束時的值)
2018-07-08
自動型變量(以下內容均來自百度)
定義一個內部變量時,如果將auto加在定義語句前面,則該變量是自動型變量;定義內部變量時,如果沒有加任何存儲類型限定,該變量默認為自動型變量。
auto只能修飾內部變量,不能修飾外部變量。也就是說只有內部變量可以定義為自動型變量,外部變量不能定義為自動型變量。
事實上,auto沒有什么實際用處。內部變量已經默認為自動型變量。
2.靜態型變量
外部變量和內部變量都可以定義為靜態型變量。
如果在定義一個內部變量時,在定義語句最前面加上static存儲類型限定詞,那么該變量將是一個靜態型變量。該變量將在靜態數據區分配存儲空間。這種變量作用域雖然只在函數內部,但是該變量將一直在靜態數據區占據存儲空間,直到程序運行結束。
定義外部變量時,如果不加存儲類型限定詞,它將在靜態數據區分配存儲空間。它的作用域除了本文件以外,其他文件通過extern語句聲明后也可訪問。
但是,如果在定義一個外部變量時,加上static限定詞,其作用域將變窄,該變量只在本文件中可見,在其他文件中將不可見,此時在其他文件中即使用extern聲明也不能擴展其作用域。這是一個外部靜態型變量,也在靜態數據區分配存儲空間。
注意:對于函數的作用域也是這樣,如果在函數定義時加上了static限定詞,那么該函數也只在其定義文件內可見(“可見”的意思就是在在該范圍內可以使用)。在其他文件中即使聲明了也不可以調用。另外,對于函數聲明而言可以省略extern關鍵字。
一個文件中加了static的同名外部變量將隱藏其他文件中定義的未加static的外部變量。也就是說,static變量能夠屏蔽其他文件中的同名外部變量,這功能有點像函數的內部變量能夠屏蔽同名的外部變量一樣。但是,不同文件中如具有未加static的多個同名外部變量則是非法的。
static限定詞常用于外部變量,也可用于函數。正常情況下,函數名字是全局的,對程序的任何部分都是可見的。如果在定義一個函數時用static限定,該函數將在其定義文件以外不可見。
static限定詞同樣能夠應用于內部變量。此時,該變量將是一個內部靜態型變量。內部靜態型變量就像自動變量一樣是屬于某個特定函數的內部變量。但是,同自動型變量不同,它們一直在內存中存在,而不是隨著函數的每次調用而存在,隨著函數調用結束而消失。這意味著內部靜態型變量提供了單個函數內部私有的、持久的存儲。也就是說內部靜態型變量只在函數被調用時起作用,但是它將在程序的整個運行時間內一直占據內存空間。
3.寄存器型變量
register限定詞通知編譯器--程序中的變量將頻繁使用。它的意思是建議編譯器將程序中用register限定的變量放置在計算機的內部寄存其中,這樣可能得到更小更快的程序。但是,編譯器將根據實際情況考慮是否采納該建議--是否將register變量處理為寄存器變量最終決定權還是在編譯器。
如下使用register:
register int x;/*x必須是內部變量*/
register char ch;/*ch必須是內部變量*/
register只能用于限定自動型變量和函數的形式參數。也就是說register只對內部變量起作用,而且只能限定內部非靜態型變量,不能限定內部靜態型變量。
register也可以應用于形式參數,格式如下:
f(register unsigned m,register long n) /*register應用于形式參數*/
{
? ? register int i; /* register應用于內部變量*/
}
在傳統C中,register變量的使用有諸多限制,它決定于硬件的實現方式。在每一個函數中只有少數幾個變量可以保存在寄存器中,而且也只有特定的類型才行。過量的register變量看起來是無害的,但是超量以后,編譯器將忽略新的register變量。另外不管register變量實際上是否被編譯器設置為寄存器型變量,都不可能取得該變量的地址。寄存器型變量的類型和數量的多少隨計算機不同而異。register變量一般只能夠設置幾個。傳統C的register類型限定于char、int等類型。像float、double、數組等是不可以設定為register型變量的。但是,在最新C99標準中,任何類型都可以定義為register變量,register聲明的目的只是告訴編譯器以盡快的速度處理該變量,編譯器不見得非把它處理為register變量。
4.外部型變量
如extern用于變量定義語句前面,那么該語句就只能是一個聲明語句了,他不再是一個變量定義語句。它僅僅是一個聲明--聲明該變量已經在別的地方定義,只是告訴編譯器該變量的類型。
extern int sp;/* sp在別的地方定義,并分配存儲單元,本語句只是聲明它已經定義過*/
該語句聲明了sp在別的地方已經定義,并分配了存儲空間,本語句只是說明sp已經定義過的類型為int,并不再為它分配內存空間。這樣聲明以后,在本文件余下部分就可以使用sp了。1.自動型變量
定義一個內部變量時,如果將auto加在定義語句前面,則該變量是自動型變量;定義內部變量時,如果沒有加任何存儲類型限定,該變量默認為自動型變量。
auto只能修飾內部變量,不能修飾外部變量。也就是說只有內部變量可以定義為自動型變量,外部變量不能定義為自動型變量。
事實上,auto沒有什么實際用處。內部變量已經默認為自動型變量。
2.靜態型變量
外部變量和內部變量都可以定義為靜態型變量。
如果在定義一個內部變量時,在定義語句最前面加上static存儲類型限定詞,那么該變量將是一個靜態型變量。該變量將在靜態數據區分配存儲空間。這種變量作用域雖然只在函數內部,但是該變量將一直在靜態數據區占據存儲空間,直到程序運行結束。
定義外部變量時,如果不加存儲類型限定詞,它將在靜態數據區分配存儲空間。它的作用域除了本文件以外,其他文件通過extern語句聲明后也可訪問。
但是,如果在定義一個外部變量時,加上static限定詞,其作用域將變窄,該變量只在本文件中可見,在其他文件中將不可見,此時在其他文件中即使用extern聲明也不能擴展其作用域。這是一個外部靜態型變量,也在靜態數據區分配存儲空間。
注意:對于函數的作用域也是這樣,如果在函數定義時加上了static限定詞,那么該函數也只在其定義文件內可見(“可見”的意思就是在在該范圍內可以使用)。在其他文件中即使聲明了也不可以調用。另外,對于函數聲明而言可以省略extern關鍵字。
一個文件中加了static的同名外部變量將隱藏其他文件中定義的未加static的外部變量。也就是說,static變量能夠屏蔽其他文件中的同名外部變量,這功能有點像函數的內部變量能夠屏蔽同名的外部變量一樣。但是,不同文件中如具有未加static的多個同名外部變量則是非法的。
static限定詞常用于外部變量,也可用于函數。正常情況下,函數名字是全局的,對程序的任何部分都是可見的。如果在定義一個函數時用static限定,該函數將在其定義文件以外不可見。
static限定詞同樣能夠應用于內部變量。此時,該變量將是一個內部靜態型變量。內部靜態型變量就像自動變量一樣是屬于某個特定函數的內部變量。但是,同自動型變量不同,它們一直在內存中存在,而不是隨著函數的每次調用而存在,隨著函數調用結束而消失。這意味著內部靜態型變量提供了單個函數內部私有的、持久的存儲。也就是說內部靜態型變量只在函數被調用時起作用,但是它將在程序的整個運行時間內一直占據內存空間。
3.寄存器型變量
register限定詞通知編譯器--程序中的變量將頻繁使用。它的意思是建議編譯器將程序中用register限定的變量放置在計算機的內部寄存其中,這樣可能得到更小更快的程序。但是,編譯器將根據實際情況考慮是否采納該建議--是否將register變量處理為寄存器變量最終決定權還是在編譯器。
如下使用register:
register int x;/*x必須是內部變量*/
register char ch;/*ch必須是內部變量*/
register只能用于限定自動型變量和函數的形式參數。也就是說register只對內部變量起作用,而且只能限定內部非靜態型變量,不能限定內部靜態型變量。
register也可以應用于形式參數,格式如下:
f(register unsigned m,register long n) /*register應用于形式參數*/
{
? ? register int i; /* register應用于內部變量*/
}
在傳統C中,register變量的使用有諸多限制,它決定于硬件的實現方式。在每一個函數中只有少數幾個變量可以保存在寄存器中,而且也只有特定的類型才行。過量的register變量看起來是無害的,但是超量以后,編譯器將忽略新的register變量。另外不管register變量實際上是否被編譯器設置為寄存器型變量,都不可能取得該變量的地址。寄存器型變量的類型和數量的多少隨計算機不同而異。register變量一般只能夠設置幾個。傳統C的register類型限定于char、int等類型。像float、double、數組等是不可以設定為register型變量的。但是,在最新C99標準中,任何類型都可以定義為register變量,register聲明的目的只是告訴編譯器以盡快的速度處理該變量,編譯器不見得非把它處理為register變量。
4.外部型變量
如extern用于變量定義語句前面,那么該語句就只能是一個聲明語句了,他不再是一個變量定義語句。它僅僅是一個聲明--聲明該變量已經在別的地方定義,只是告訴編譯器該變量的類型。
extern int sp;/* sp在別的地方定義,并分配存儲單元,本語句只是聲明它已經定義過*/
該語句聲明了sp在別的地方已經定義,并分配了存儲空間,本語句只是說明sp已經定義過的類型為int,并不再為它分配內存空間。這樣聲明以后,在本文件余下部分就可以使用sp了。