C語言一些難點(diǎn)
1、包含預(yù)定義頭文件<>和""的區(qū)別
<>和""表示編譯器在搜索頭文件時的順序不同,<>表示從系統(tǒng)目錄下開始搜索,然后再搜索PATH環(huán)境變量所列出的目錄,不搜索當(dāng)前目錄,""是表示從當(dāng)前目錄開始搜索,然后是系統(tǒng)目錄和PATH環(huán)境變量所列出的目錄。所以,系統(tǒng)頭文件一般用<>,用戶自己定義的則可以使用"",加快搜索速度。
2、C語言四種存儲類型:auto、extern、register、static
(1)auto:auto只能用來標(biāo)識局部變量的存儲類型,對于局部變量,auto是默認(rèn)的存儲類型。auto標(biāo)識的變量存儲在棧區(qū)中。
(2)extern:extern用來聲明在當(dāng)前文件中引用在當(dāng)前項目中的其它文件中定義的全局變量。如果全局變量未被初始化,那么將被存在BBS區(qū)中,且在編譯時,自動將其值賦值為0,如果已經(jīng)被初始化,那么就被存在數(shù)據(jù)區(qū)中。全局變量,不管是否被初始化,其生命周期都是整個程序運(yùn)行過程中,為了節(jié)省內(nèi)存空間,在當(dāng)前文件中使用extern來聲明其它文件中定義的全局變量時,就不會再為其分配內(nèi)存空間。
(3)register:聲明為register的變量在由內(nèi)存調(diào)入到CPU寄存器后,則常駐在CPU的寄存器中,因此訪register變量將在很大程度上提高效率,因為省去了變量由內(nèi)存調(diào)入到寄存器過程中的好幾個指令周期。
注意:
register變量必須是能被CPU寄存器所接受的類型,這通常意味著register變量必須是一個單個的值,并且其長度應(yīng)小于或等于整型的長度。但是,有些機(jī)器的寄存器也能存放浮點(diǎn)數(shù)。
register變量可能不存放在內(nèi)存中,所以不能用取址符運(yùn)算符“ & ”。
只有局部變量和形參可以作為register變量,全局變量不行。
靜態(tài)變量不能定義為register。
(4)static:被聲明為靜態(tài)類型的變量,無論是全局的還是局部的,都存儲在數(shù)據(jù)區(qū)中,其生命周期為整個程序,如果是靜態(tài)局部變量,其作用域為一對{}內(nèi),如果是靜態(tài)全局變量,其作用域為當(dāng)前文件。靜態(tài)變量如果沒有被初始化,則自動初始化為0。靜態(tài)變量只能夠初始化一次。
注意:
全局變量是不顯式用static修飾的全局變量,但全局變量默認(rèn)是靜態(tài)的,作用域是整個工程,在一個文件內(nèi)定義的全局變量,在另一個文件中,通過extern全局變量名的聲明,就可以使用全局變量。全局靜態(tài)變量是顯式用static修飾的全局變量,作用域是所在的文件,其他的文件即使用extern聲明也不能使用。
靜態(tài)函數(shù):在函數(shù)的返回類型前加上static關(guān)鍵字,函數(shù)即被定義為靜態(tài)函數(shù)。靜態(tài)函數(shù)與普通函數(shù)不同,它只能在聲明它的文件當(dāng)中可見,不能被其它文件使用。其它文件中可以定義相同名字的函數(shù),不會發(fā)生沖突。