C基礎(chǔ)知識(shí)

基礎(chǔ)問(wèn)題

1.static關(guān)鍵字和const關(guān)鍵字。

static:

  • 作用于變量時(shí):用static聲明局部變量-------局部變量指在代碼塊{}內(nèi)部定義的變量,只在代碼塊內(nèi)部有效(作用域),其缺省的存儲(chǔ)方式是自動(dòng)變量或說(shuō)是動(dòng)態(tài)存儲(chǔ)的,即指令執(zhí)行到變量定義處時(shí)才給變量分配存儲(chǔ)單元,跳出代碼塊時(shí)釋放內(nèi)存單元(生命期)。用static聲明局部變量時(shí),則改變變量的存儲(chǔ)方式(生命期),使變量成為靜態(tài)的局部變量,即編譯時(shí)就為變量分配內(nèi)存,直到程序退出才釋放存儲(chǔ)單元。這樣,使得該局部變量有記憶功能,可以記憶上次的數(shù)據(jù),不過(guò)由于仍是局部變量,因而只能在代碼塊內(nèi)部使用(作用域不變)。

用static聲明外部變量-------外部變量指在所有代碼塊{}之外定義的變量,它缺省為靜態(tài)變量,編譯時(shí)分配內(nèi)存,程序結(jié)束時(shí)釋放內(nèi)存單元。同時(shí)其作用域很廣,整個(gè)文件都有效甚至別的文件也能引用它。為了限制某些外部變量的作用域,使其只在本文件中有效,而不能被其他文件引用,可以用static關(guān)鍵字對(duì)其作出聲明。

  • 作用于函數(shù)時(shí):使用static用于函數(shù)定義時(shí),對(duì)函數(shù)的連接方式產(chǎn)生影響,使得函數(shù)只在本文件內(nèi)部有效,對(duì)其他文件是不可見(jiàn)的。這樣的函數(shù)又叫作靜態(tài)函數(shù)。使用靜態(tài)函數(shù)的好處是,不用擔(dān)心與其他文件的同名函數(shù)產(chǎn)生干擾,另外也是對(duì)函數(shù)本身的一種保護(hù)機(jī)制。

如果想要其他文件可以引用本地函數(shù),則要在函數(shù)定義時(shí)使用關(guān)鍵字extern,表示該函數(shù)是外部函數(shù),可供其他文件調(diào)用。另外在要引用別的文件中定義的外部函數(shù)的文件中,使用extern聲明要用的外部函數(shù)即可。

const:
(1)欲阻止一個(gè)變量被改變,可以使用const關(guān)鍵字。在定義該const變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎](méi)有機(jī)會(huì)再去改變它了;
(2)對(duì)指針來(lái)說(shuō),可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const,或二者同時(shí)指定為const;
(3)在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;
(4)對(duì)于類(lèi)的成員函數(shù),若指定其為const類(lèi)型,則表明其是一個(gè)常函數(shù),不能修改類(lèi)的 成員變量;
(5)對(duì)于類(lèi)的成員函數(shù),有時(shí)候必須指定其返回值為const類(lèi)型,以使得其返回值不為“左值”

內(nèi)存管理問(wèn)題

1.new,delete,malloc,free關(guān)系

1,malloc與free是C++/C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)函數(shù),new/delete是C++的運(yùn)算符。它們都可用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。
2, 對(duì)于非內(nèi)部數(shù)據(jù)類(lèi)型的對(duì)象而言,光用maloc/free無(wú)法滿(mǎn)足動(dòng)態(tài)對(duì)象的要求。對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前要自動(dòng)執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫(kù)函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free。
3,因此C++語(yǔ)言需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。注意new/delete不是庫(kù)函數(shù)。
4,C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動(dòng)態(tài)內(nèi)存
new 是個(gè)操作符,和什么"+","-","="...有一樣的地位
簡(jiǎn)單的說(shuō):
malloc,free是c的函數(shù),new,delete是c++的運(yùn)算符
此外,new是強(qiáng)制類(lèi)型的,malloc不是,需要類(lèi)型轉(zhuǎn)換
當(dāng)然還有很多不同
new 可以調(diào)用構(gòu)造函數(shù)在聲明的時(shí)候初始化
malloc只是分配空間,需要在其他地方初始化
而delete不僅會(huì)釋放空間,在釋放前會(huì)調(diào)用析構(gòu)函數(shù)
而且malloc需要指定分配空間大小, 而new是自動(dòng)計(jì)算的

2.全局變量和局部變量在內(nèi)存中是否有區(qū)別

1.生存周期不同 全局變量:全局區(qū)(靜態(tài)區(qū))(static):全局變量和靜態(tài)變量是存儲(chǔ)在一起的,初始化過(guò)的全局變量和靜態(tài)變量在同一塊區(qū)域,未初始化的全局變量和靜態(tài)變量存放在一塊相鄰的區(qū)域內(nèi)。此區(qū)域由系統(tǒng)在程序結(jié)束后釋放 局部變量: 放在堆棧中。由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類(lèi)似于中的棧
2.作用范圍不同 全局變量具有全局作用域。全局變量只需在一個(gè)源文件中定義,就可以作用于所有的源文件。當(dāng)然,其他不包含全局變量定義的源文件需要用extern 關(guān)鍵字再次聲明這個(gè)全局變量。 局部變量也只有局部作用域,它是自動(dòng)對(duì)象(auto),它在程序運(yùn)行期間不是一直存在,而是只在函數(shù)執(zhí)行期間存在,函數(shù)的一次調(diào)用執(zhí)行結(jié)束后,變量被撤銷(xiāo),其所占用的內(nèi)存也被收回
3.靜態(tài)變量分為 全局靜態(tài)變量(常稱(chēng)為全局變量)和局部靜態(tài)變量(static修飾的變量)

3.內(nèi)存分區(qū)情況

  • 代碼區(qū):存放函數(shù)二進(jìn)制代碼
  • 數(shù)據(jù)區(qū):系統(tǒng)運(yùn)行時(shí)申請(qǐng)內(nèi)存并且初始化,系統(tǒng)退出時(shí)有系統(tǒng)釋放,粗放全局變量,靜態(tài)變量,常量。
  • 堆區(qū):通過(guò)malloc等函數(shù)或NEW等操作申請(qǐng)得到,有程序員手動(dòng)申請(qǐng)釋放。
  • 棧區(qū):函數(shù)模塊內(nèi)申請(qǐng),函數(shù)結(jié)束時(shí)由系統(tǒng)自動(dòng)釋放,存放局部變量,函數(shù)參數(shù)。

指針問(wèn)題

1.指針與地址的區(qū)別

  • 指針和地址最大的區(qū)別就是指針是有類(lèi)型的,地址是沒(méi)有類(lèi)型的。我們當(dāng)然可以通過(guò)絕對(duì)地址的方式找到函數(shù)和數(shù)據(jù),但是地址是沒(méi)有類(lèi)型的,不能對(duì)地址進(jìn)行算術(shù)操作,在涉及諸如數(shù)組等操作時(shí)就不能通過(guò)地址的自增和自減來(lái)訪問(wèn)數(shù)組的各個(gè)變量。
  • 指針是由地址和類(lèi)型兩部分構(gòu)成的,指向數(shù)據(jù)的指針不僅記錄該數(shù)據(jù)的在內(nèi)存中的存放的地址,還記錄該數(shù)據(jù)的類(lèi)型,即在內(nèi)存中占用幾個(gè)字節(jié),這是地址所不具有的。

2.指針與數(shù)組名字的關(guān)系

數(shù)組名表示指向數(shù)組首地址的指針,但這個(gè)指針很特別,它的值(指針的值指的是指針?biāo)傅牡刂罚┎荒鼙桓膶?xiě),能改寫(xiě)的僅僅是其指向的內(nèi)容。換句話說(shuō),數(shù)組名只能指向數(shù)組的首地址,如果有數(shù)組char a[];那么如果出現(xiàn)a = a+1;這是編譯都通不過(guò)的錯(cuò)誤。而對(duì)于一個(gè)普通的指針是可以的,再比如有數(shù)組char a[];那么再定義一個(gè)char *p = a;然后再用p = p+1是合法的,這表示讓指針p指向&a[1]。它們的第二個(gè)區(qū)別是:每當(dāng)用到數(shù)組名這個(gè)指針的時(shí)候,系統(tǒng)都會(huì)傳入數(shù)組的信息,而普通的指針只是一個(gè)4字節(jié)的整數(shù)

3.怎樣防止指針的越界使用問(wèn)題

必須讓指針指向一個(gè)有效的內(nèi)存地址
1 防止數(shù)組越界
2 防止向一塊內(nèi)存中拷貝過(guò)多的內(nèi)容
3 防止使用空指針
4 防止改變 const 修改的指針
5 防止改變指向靜態(tài)存儲(chǔ)區(qū)的內(nèi)容
6 防止兩次釋放一個(gè)指針
7 防止使用野指針.

4.常指針,常量的指針,指針函數(shù),函數(shù)指針

  • 常指針:常指針的指針本身為一常量,它一旦指向某個(gè)地址,就不能再指向別的地址,但可以通過(guò)它修改它所指向地址中內(nèi)容的值;
  • 常量的指針:指向常量的指針,它所指向地址的內(nèi)容為常量,不能通過(guò)它來(lái)改變它所指向地址的內(nèi)容,但指針本身不是常量,所以可以讓它指向別的地址,即可以改變它的指向地址。
  • 指針函數(shù):函數(shù)返回值為一個(gè)指針
  • 函數(shù)指針:指向函數(shù)的指針,可以用來(lái)指向函數(shù)的入口地址,從而便可以在程序中使用它來(lái)調(diào)用它所指向的函數(shù)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • main函數(shù)執(zhí)行以前,還會(huì)執(zhí)行什么代碼? 答案:全局對(duì)象的構(gòu)造函數(shù)會(huì)在 main 函數(shù)之前執(zhí)行 static的應(yīng)用...
    曾令偉閱讀 1,390評(píng)論 0 2
  • 1. C++基礎(chǔ)知識(shí)點(diǎn) 1.1 有符號(hào)類(lèi)型和無(wú)符號(hào)類(lèi)型 當(dāng)我們賦給無(wú)符號(hào)類(lèi)型一個(gè)超出它表示范圍的值時(shí),結(jié)果是初始值...
    Mr希靈閱讀 18,040評(píng)論 3 82
  • 1.在C++ 程序中調(diào)用被C 編譯器編譯后的函數(shù),為什么要加extern “C”? 答:首先,extern是C/C...
    曾令偉閱讀 926評(píng)論 0 4
  • const 引用 const 引用是指向 const 對(duì)象的引用:const int ival = 1024;co...
    rogerwu1228閱讀 661評(píng)論 0 1
  • Yesterday,I buy a piece of beef. Today,I eat beef. It is ...
    幸運(yùn)的xiaotang閱讀 299評(píng)論 0 0