基礎(chǔ)問題
1.static關(guān)鍵字和const關(guān)鍵字。
static:
- 作用于變量時:用static聲明局部變量-------局部變量指在代碼塊{}內(nèi)部定義的變量,只在代碼塊內(nèi)部有效(作用域),其缺省的存儲方式是自動變量或說是動態(tài)存儲的,即指令執(zhí)行到變量定義處時才給變量分配存儲單元,跳出代碼塊時釋放內(nèi)存單元(生命期)。用static聲明局部變量時,則改變變量的存儲方式(生命期),使變量成為靜態(tài)的局部變量,即編譯時就為變量分配內(nèi)存,直到程序退出才釋放存儲單元。這樣,使得該局部變量有記憶功能,可以記憶上次的數(shù)據(jù),不過由于仍是局部變量,因而只能在代碼塊內(nèi)部使用(作用域不變)。
用static聲明外部變量-------外部變量指在所有代碼塊{}之外定義的變量,它缺省為靜態(tài)變量,編譯時分配內(nèi)存,程序結(jié)束時釋放內(nèi)存單元。同時其作用域很廣,整個文件都有效甚至別的文件也能引用它。為了限制某些外部變量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static關(guān)鍵字對其作出聲明。
- 作用于函數(shù)時:使用static用于函數(shù)定義時,對函數(shù)的連接方式產(chǎn)生影響,使得函數(shù)只在本文件內(nèi)部有效,對其他文件是不可見的。這樣的函數(shù)又叫作靜態(tài)函數(shù)。使用靜態(tài)函數(shù)的好處是,不用擔(dān)心與其他文件的同名函數(shù)產(chǎn)生干擾,另外也是對函數(shù)本身的一種保護機制。
如果想要其他文件可以引用本地函數(shù),則要在函數(shù)定義時使用關(guān)鍵字extern,表示該函數(shù)是外部函數(shù),可供其他文件調(diào)用。另外在要引用別的文件中定義的外部函數(shù)的文件中,使用extern聲明要用的外部函數(shù)即可。
const:
(1)欲阻止一個變量被改變,可以使用const關(guān)鍵字。在定義該const變量時,通常需要對它進行初始化,因為以后就沒有機會再去改變它了;
(2)對指針來說,可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時指定為const;
(3)在一個函數(shù)聲明中,const可以修飾形參,表明它是一個輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
(4)對于類的成員函數(shù),若指定其為const類型,則表明其是一個常函數(shù),不能修改類的 成員變量;
(5)對于類的成員函數(shù),有時候必須指定其返回值為const類型,以使得其返回值不為“左值”
內(nèi)存管理問題
1.new,delete,malloc,free關(guān)系
1,malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。
2, 對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強加于malloc/free。
3,因此C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以一個能完成清理與釋放內(nèi)存工作的運算符delete。注意new/delete不是庫函數(shù)。
4,C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存
new 是個操作符,和什么"+","-","="...有一樣的地位
簡單的說:
malloc,free是c的函數(shù),new,delete是c++的運算符
此外,new是強制類型的,malloc不是,需要類型轉(zhuǎn)換
當(dāng)然還有很多不同
new 可以調(diào)用構(gòu)造函數(shù)在聲明的時候初始化
malloc只是分配空間,需要在其他地方初始化
而delete不僅會釋放空間,在釋放前會調(diào)用析構(gòu)函數(shù)
而且malloc需要指定分配空間大小, 而new是自動計算的
2.全局變量和局部變量在內(nèi)存中是否有區(qū)別
1.生存周期不同 全局變量:全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量是存儲在一起的,初始化過的全局變量和靜態(tài)變量在同一塊區(qū)域,未初始化的全局變量和靜態(tài)變量存放在一塊相鄰的區(qū)域內(nèi)。此區(qū)域由系統(tǒng)在程序結(jié)束后釋放 局部變量: 放在堆棧中。由編譯器自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于中的棧
2.作用范圍不同 全局變量具有全局作用域。全局變量只需在一個源文件中定義,就可以作用于所有的源文件。當(dāng)然,其他不包含全局變量定義的源文件需要用extern 關(guān)鍵字再次聲明這個全局變量。 局部變量也只有局部作用域,它是自動對象(auto),它在程序運行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后,變量被撤銷,其所占用的內(nèi)存也被收回
3.靜態(tài)變量分為 全局靜態(tài)變量(常稱為全局變量)和局部靜態(tài)變量(static修飾的變量)
3.內(nèi)存分區(qū)情況
- 代碼區(qū):存放函數(shù)二進制代碼
- 數(shù)據(jù)區(qū):系統(tǒng)運行時申請內(nèi)存并且初始化,系統(tǒng)退出時有系統(tǒng)釋放,粗放全局變量,靜態(tài)變量,常量。
- 堆區(qū):通過malloc等函數(shù)或NEW等操作申請得到,有程序員手動申請釋放。
- 棧區(qū):函數(shù)模塊內(nèi)申請,函數(shù)結(jié)束時由系統(tǒng)自動釋放,存放局部變量,函數(shù)參數(shù)。
指針問題
1.指針與地址的區(qū)別
- 指針和地址最大的區(qū)別就是指針是有類型的,地址是沒有類型的。我們當(dāng)然可以通過絕對地址的方式找到函數(shù)和數(shù)據(jù),但是地址是沒有類型的,不能對地址進行算術(shù)操作,在涉及諸如數(shù)組等操作時就不能通過地址的自增和自減來訪問數(shù)組的各個變量。
- 指針是由地址和類型兩部分構(gòu)成的,指向數(shù)據(jù)的指針不僅記錄該數(shù)據(jù)的在內(nèi)存中的存放的地址,還記錄該數(shù)據(jù)的類型,即在內(nèi)存中占用幾個字節(jié),這是地址所不具有的。
2.指針與數(shù)組名字的關(guān)系
數(shù)組名表示指向數(shù)組首地址的指針,但這個指針很特別,它的值(指針的值指的是指針?biāo)傅牡刂罚┎荒鼙桓膶?,能改寫的僅僅是其指向的內(nèi)容。換句話說,數(shù)組名只能指向數(shù)組的首地址,如果有數(shù)組char a[];那么如果出現(xiàn)a = a+1;這是編譯都通不過的錯誤。而對于一個普通的指針是可以的,再比如有數(shù)組char a[];那么再定義一個char *p = a;然后再用p = p+1是合法的,這表示讓指針p指向&a[1]。它們的第二個區(qū)別是:每當(dāng)用到數(shù)組名這個指針的時候,系統(tǒng)都會傳入數(shù)組的信息,而普通的指針只是一個4字節(jié)的整數(shù)
3.怎樣防止指針的越界使用問題
必須讓指針指向一個有效的內(nèi)存地址
1 防止數(shù)組越界
2 防止向一塊內(nèi)存中拷貝過多的內(nèi)容
3 防止使用空指針
4 防止改變 const 修改的指針
5 防止改變指向靜態(tài)存儲區(qū)的內(nèi)容
6 防止兩次釋放一個指針
7 防止使用野指針.
4.常指針,常量的指針,指針函數(shù),函數(shù)指針
- 常指針:常指針的指針本身為一常量,它一旦指向某個地址,就不能再指向別的地址,但可以通過它修改它所指向地址中內(nèi)容的值;
- 常量的指針:指向常量的指針,它所指向地址的內(nèi)容為常量,不能通過它來改變它所指向地址的內(nèi)容,但指針本身不是常量,所以可以讓它指向別的地址,即可以改變它的指向地址。
- 指針函數(shù):函數(shù)返回值為一個指針
- 函數(shù)指針:指向函數(shù)的指針,可以用來指向函數(shù)的入口地址,從而便可以在程序中使用它來調(diào)用它所指向的函數(shù)。