c/c++程序的編譯過(guò)程(GCC的編譯流程)
主要分為四個(gè)階段:預(yù)處理愿险,編譯階段嫉鲸,匯編階段,鏈接階段
當(dāng)我們寫(xiě)好一個(gè)C語(yǔ)言程序的時(shí)候棵磷,其文件的后綴為.c蛾狗,稱(chēng)它為源程序。
預(yù)處理:編寫(xiě)好的源程序通過(guò)預(yù)處理器仪媒,預(yù)處理器會(huì)識(shí)別字符#開(kāi)頭的命令沉桌,告訴預(yù)處理器進(jìn)行讀取字符#后對(duì)應(yīng)的系統(tǒng)頭文件內(nèi)容,并將這些讀取的內(nèi)容插入到程序文本中(宏替換),得到另一個(gè)比之前大的C程序留凭,此時(shí)修改后的文件的后綴名通常為.i佃扼。
編譯階段:編譯器(ccl)會(huì)將預(yù)處理過(guò)的C程序進(jìn)行編譯,得到一個(gè)匯編語(yǔ)言程序(此時(shí)的文件還是文本文件蔼夜,文件后綴為.s)松嘶,使我們寫(xiě)的源程序變成更加接近低級(jí)機(jī)器語(yǔ)言指令。
匯編階段:匯編器(as)的工作就是將編譯階段得到的匯編語(yǔ)言程序翻譯成機(jī)器語(yǔ)言指令挎扰,并把這些指令打包成可重定位目標(biāo)程序的格式翠订,打包完畢后將其保存在目標(biāo)文件中,該文件的后綴為.o遵倦,此時(shí)的文件是二進(jìn)制文件尽超。
鏈接階段:匯編階段得到的目標(biāo)文件還無(wú)法直接運(yùn)行,因?yàn)樵闯绦蛑杏锌赡苡卸鄠€(gè)文件梧躺,而匯編階段做的僅僅只是將每個(gè)文件進(jìn)行處理似谁,所以鏈接器(ld)就是將各個(gè)目標(biāo)文件進(jìn)行合并處理,使他們變成一個(gè)可以被加載到系統(tǒng)內(nèi)存中執(zhí)行的統(tǒng)一整體掠哥,這時(shí)候稱(chēng)它為可執(zhí)行文件巩踏。
強(qiáng)類(lèi)型語(yǔ)言 VS 弱類(lèi)型語(yǔ)言
- 強(qiáng)類(lèi)型語(yǔ)言是一種強(qiáng)制類(lèi)型定義的語(yǔ)言,一旦某一個(gè)變量被定義類(lèi)型续搀,如果不經(jīng)過(guò)強(qiáng)制轉(zhuǎn)換塞琼,則它永遠(yuǎn)就是該數(shù)據(jù)類(lèi)型了,強(qiáng)類(lèi)型語(yǔ)言包括Java禁舷、.net 彪杉、Python、C++等語(yǔ)言牵咙。
- 弱類(lèi)型語(yǔ)言是一種弱類(lèi)型定義的語(yǔ)言派近,某一個(gè)變量被定義類(lèi)型,該變量可以根據(jù)環(huán)境變化自動(dòng)進(jìn)行轉(zhuǎn)換洁桌,不需要經(jīng)過(guò)顯性強(qiáng)制轉(zhuǎn)換渴丸。
- 無(wú)論是強(qiáng)類(lèi)型語(yǔ)言還是弱類(lèi)型語(yǔ)言,判別的根本是是否會(huì)隱性的進(jìn)行語(yǔ)言類(lèi)型轉(zhuǎn)變另凌。強(qiáng)類(lèi)型語(yǔ)言在速度上略遜于弱類(lèi)型語(yǔ)言谱轨,但是強(qiáng)類(lèi)型定義語(yǔ)言帶來(lái)的嚴(yán)謹(jǐn)性又能避免不必要的錯(cuò)誤。
數(shù)組和指針的區(qū)別
指針 | 數(shù)組 |
---|---|
存放的是數(shù)據(jù)在內(nèi)存中的地址 | 存儲(chǔ)多個(gè)相同類(lèi)型數(shù)據(jù)的集合 |
同類(lèi)型指針可以相互賦值 | 數(shù)組不可以途茫,只能一個(gè)一個(gè)元素賦值碟嘴、拷貝 |
指針是間接訪問(wèn)數(shù)據(jù)溪食,需要通過(guò)解引用來(lái)獲得指定地址的內(nèi)容 | 數(shù)組可以直接通過(guò)下標(biāo)訪問(wèn)數(shù)據(jù) |
sizeof(指針)是指針變量的大小 | sizeof(數(shù)組名)數(shù)組所占存儲(chǔ)空間的內(nèi)存 |
指針名可以表示地址囊卜,并且可以修改 | 數(shù)組名也可以表示地址但是不可以修改 |
補(bǔ)充:數(shù)組傳參時(shí)會(huì)退化成為指針
C語(yǔ)言只會(huì)以值拷貝的方式傳遞參數(shù),參數(shù)傳遞時(shí),如果只拷貝整個(gè)數(shù)組栅组,效率會(huì)大大降低雀瓢,并且在參數(shù)位于棧上,太大的數(shù)組拷貝將會(huì)導(dǎo)致棧溢出玉掸。因此刃麸,C語(yǔ)言將數(shù)組的傳參進(jìn)行了退化。將整個(gè)數(shù)組拷貝一份傳入函數(shù)時(shí)司浪,將數(shù)組名看做常量指針泊业,傳數(shù)組首元素的地址。
字符數(shù)組和字符串常量
const char * arr = "123";//字符串常量
字符串123保存在常量區(qū)啊易,const本來(lái)的作用使arr指向的值不能通過(guò)arr來(lái)修改吁伺,但是字符串123保存在常量區(qū),本來(lái)就不可修改租谈,所以加不加const效果都是一樣的
char * brr = "123"; //字符串常量
字符串123保存在常量區(qū)篮奄,這個(gè)arr指針指向的是同一個(gè)位置,同樣不能通過(guò)brr去修改123的值
const char crr[] = "123";
這里123本來(lái)是在棧上的割去,但是編譯器可能會(huì)做某些優(yōu)化窟却,將其放到常量區(qū)
char drr[] = "123";//字符數(shù)組
字符串123保存在棧區(qū),可以通過(guò)drr進(jìn)行修改
此處的賦值是將常量區(qū)的字符串"123"拷貝到了堆棧區(qū)的數(shù)drr的空間了呻逆。數(shù)組drr是在堆棧區(qū)開(kāi)辟了空間夸赫,此時(shí)是可以修改字符串的值,因?yàn)樾薷牡氖嵌褩^(qū)的字符串的值咖城。另外此時(shí)的數(shù)組名drr是堆棧區(qū)中的"hello"的首地址憔足。
static關(guān)鍵字的作用
c++和c的區(qū)別
c++中的四種cast
c++中指針和引用的區(qū)別
指針和數(shù)組的區(qū)別
野指針&懸空指針
虛函數(shù)&純虛函數(shù)
為什么析構(gòu)函數(shù)是虛函數(shù)&為什么C++默認(rèn)的析構(gòu)函數(shù)不是虛函數(shù)
函數(shù)指針VS指針函數(shù)
C++中析構(gòu)函數(shù)的作用
靜態(tài)函數(shù)與虛函數(shù)的區(qū)別
重載&重寫(xiě)&覆蓋
多態(tài):靜態(tài)多態(tài)&動(dòng)態(tài)多態(tài)
i++與++i的區(qū)別與實(shí)現(xiàn)
四種智能指針的實(shí)現(xiàn)
字符串之間的區(qū)別