

下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C/C+深層探索讀書筆記1.字節(jié)順序:有如下代碼:int i = 0 x00000041;char *p = ( char * ) & i ;printf (“ %s / n ”,p );若為低位優(yōu)先(Little-endian )則輸出“ A ”,若為高位優(yōu)先(Big-endian )無任何輸出,因?yàn)?數(shù)值為 0的字節(jié)在 C/C+里面表示一個單字節(jié)字符串的結(jié)束,由于指針指向的第一個字節(jié)的值是“ 0”,所以系統(tǒng)認(rèn)為這是一個什么都沒有的空字符串。2.外部變量和局部靜態(tài)變量存放在(靜態(tài))數(shù)據(jù)區(qū),在整個程序運(yùn)行期間它們的地址不變, 從程序開始到結(jié)束都是固定的,任何函數(shù)都能存取這些數(shù)據(jù);函數(shù)的
2、形式參數(shù)及局部變量存放于棧中,一般地,棧是往內(nèi)存低地址方向增長的。函數(shù)之間不能訪問各自的靜態(tài)內(nèi)部變量。3.主調(diào)函數(shù) m 的局部變量 b 作為實(shí)參調(diào)用一個函數(shù) f,f 函數(shù)不能修改主調(diào)函數(shù)的這個局部 變量,此即為值傳遞,因?yàn)?m 調(diào)用 f 的時候先復(fù)制 b,從而得到一個 b 的副本,再把這個副 本賦給 f 的形式參數(shù),f 只是把 b 的值(即 b 的副本)壓棧,f 并不知道 b 的地址,f 訪問的 只是一個 b 的副本,所以改變不了 m 中 b 這個局部變量。4.聲明一個變量僅僅是告訴編譯器變量的類型,但不會導(dǎo)致編譯器為這個變量分配存儲空 間,extern int x ;是一個聲明,而定義一個變
3、量不僅告訴編譯器變量的類型,而且編譯器必 須為變量分配空間,定義的同時還可以初始化,int b ; int c=4 ; extern int d=6 ;均是定義。5.鏈接屬性指出了外部變量的可見范圍, 外部變量可以被多個函數(shù)訪問, 這些函數(shù)可以分布 在不同的 C 源文件中。static 關(guān)鍵字可以把外部變量的鏈接屬性由外部改為內(nèi)部,其他源文件的函數(shù)訪問不到經(jīng)過static 修飾的外部變量。6在 C89 中,如果要表示一個沒有任何參數(shù)的函數(shù)原型,定要加上 void ,如:int test ( void )。7局部變量都被存放在棧里面,函數(shù)調(diào)用時存在,函數(shù)結(jié)束時消失。靜態(tài)局部變量只會初始 化一次,
4、用來初始化它的值必須是編譯期便可求出的常數(shù)。8.C 語言中函數(shù)默認(rèn)是全局可見的,任何一個文件定義的函數(shù)都能在其他任何一個文件中調(diào) 用,但經(jīng)過static 修飾的函數(shù)只能被同一文件的函數(shù)調(diào)用,9函數(shù)原型的聲明,全局變量的聲明,自己定義的宏和類型均應(yīng)該放在頭文件中。10動態(tài)鏈接的意思就是在程序裝入內(nèi)存的時候才真正的把庫函數(shù)的代碼鏈接進(jìn)來確定它的 地址,并且即便有多個程序運(yùn)行,內(nèi)存中也只存在一份函數(shù)代碼。11.內(nèi)存中的動態(tài)庫中雖然只有一份副本,但動態(tài)庫的數(shù)據(jù)仍然可能有多份副本,因?yàn)槊恳?個鏈接到動態(tài)庫的進(jìn)程都可能會修改動態(tài)庫的數(shù)據(jù),每當(dāng)出現(xiàn)這種情況的時候,OS 就復(fù)制出一份數(shù)據(jù)的副本,然后修改進(jìn)程的
5、地址空間映射,使它指向新的數(shù)據(jù)副本,于是每個進(jìn)程最后修改的只是屬于自己的那份數(shù)據(jù)。12.C 語言默認(rèn)浮點(diǎn)常數(shù)是double 型的, 它對整型變量擴(kuò)展的關(guān)鍵是對被擴(kuò)展變量的符號的解釋,如果被擴(kuò)展變量是帶符號的,前面補(bǔ)1,若為無符號的,則前面補(bǔ)0。13.CPU 對內(nèi)存的訪問并不是完全任意的,如果 CPU想一次讀寫 4 個字節(jié),則給定的內(nèi)存起始地址最好是 4 的倍數(shù)。例如從 0 x00000126 讀取 4 個字節(jié)到寄存器,則 CPU 從 0 x00000124 讀 4 個字節(jié),舍掉低 16 位放到寄存器低 16 位;再從 0 x00000128 讀 4 個字節(jié),舍掉高 16 位放到高 16 位。如
6、int 占 4 個字節(jié),則凡是 int 變量的地址都是 4 的倍數(shù),稱為4 字節(jié)對 齊”。另外,應(yīng)該小心安排 struct成員的布局從而節(jié)省空間。14指針是變量,編譯器會為指針分配存儲空間,并且指針的值可以在運(yùn)行期間隨意改變。而數(shù)組名只代表某段存儲空間的起始地址,編譯器不會為數(shù)組名字分配空間, 即為一個常量,我們不可以改變數(shù)組名。15.C 編譯器會把作為參數(shù)的數(shù)組名由數(shù)組類型轉(zhuǎn)換成指針類型,在參數(shù)壓棧后,數(shù)值名字 相當(dāng)于有了自己的存儲空間,所以我們就可以像修改指針那樣去改變數(shù)組名了。16預(yù)處理程序執(zhí)行宏替換的單位是記號,而不是字符。編譯器進(jìn)行詞法分析時遵循“最大 匹配”原則,就是在遇到空白”(
7、如 space enter、tab)之前,以能夠取得的、有意義的、最長的字符串作為記號。17.預(yù)處理器的工作有:包含頭文件、進(jìn)行宏替換、去除注釋及多余空白。18.C 語言中不允許嵌套注釋,C99 以及大部分編譯器都已經(jīng)支持單行注釋,所以盡量使用單行注釋,預(yù)處理器在碰到第一個“*/ ”時就認(rèn)為注釋已經(jīng)結(jié)束。注釋有三個原則:字符串中的注釋符不起注釋作用;注釋符里的雙引號不起標(biāo)識字符串的作用;如果情況混亂從頭開始分析。19.typedef 同樣具有作用域,并且內(nèi)層的會屏蔽外層的。在同一作用域內(nèi),不能用相同的名 字定義不同的數(shù)據(jù)類型,同樣的typedef 也不能重復(fù)出現(xiàn)(但C+中允許重復(fù)出現(xiàn)多次)。t
8、ypedef 的作用范圍最大只能是它所在的編譯單元(源文件),不同源文件里的 typedef 相互獨(dú)立,無任何限制。預(yù)處理器分析#define 時值進(jìn)行詞法分析,而編譯器對typedef 不僅進(jìn)行詞法分析,還進(jìn)行語法分析,用它定義的類型對聲明或定義語句中的每一個變量都起作用。20.C+能夠把已用常量賦值的const 變量看作編譯期常數(shù),C沒有這種功能;C+默認(rèn) const變量是內(nèi)部的,而 C 默認(rèn)是外部的;C 只允許用常數(shù)初始化 const 外部變量,C+沒有這種 限制。21.volatile 用來修飾一個變量,它告訴編譯器這個變量可能會被外部事件修改,那么編譯器 在優(yōu)化代碼時會考慮這一點(diǎn)。2
9、2字符串是常量的一種,不能被改變。字符串會被編譯器安排到只讀數(shù)據(jù)區(qū),我們可以通過一個字符指針讀取字符串但絕對不能修改字符串,否則就會發(fā)生運(yùn)行期錯誤。當(dāng)我們用字符串來初始化字符數(shù)組時,編譯器在棧中為數(shù)組分配空間,然后把字符串中的所有字符復(fù)制到數(shù)組中。若有 char a = ” abcde” ; a 0= z;則語句 a 0= z;修改的不是只 讀數(shù)據(jù)區(qū)中的字符串常量,而是由字符串常量復(fù)制而來的存儲于棧中的數(shù)組a 的元素。23.C 語言中 void 的特點(diǎn):1它可以和其它任何類型的指針(函數(shù)指針除外)相互轉(zhuǎn)化而不需要類型強(qiáng)制轉(zhuǎn)換;2我們不能對它進(jìn)行解引用及下標(biāo)操作。24.C 編譯器對 NULL 通
10、常這樣實(shí)現(xiàn):#define NULL (void *) 0 ,由于 void 指針可以不需 要強(qiáng)制轉(zhuǎn)換就賦值給任何其他類型的指針(函數(shù)指針除外),我們可以方便地使用 NULL ,如 int *p = NULL; ,C+編譯器對 NULL 的實(shí)現(xiàn)是 # define NULL 0,在 C/C+中常數(shù) 0 能夠無須任何強(qiáng)制類型轉(zhuǎn)換就賦給任何類型指針。25.C89 添加了一個新的預(yù)處理指令 # pragma,它的作用是為特定的編譯器提供特定的編譯指 示(如優(yōu)化代碼的指示),這些指示是具體針對某一種編譯器的,其他編譯器可能不知道該 指示的含義又或者對該指示有不同的理解,如果出現(xiàn)這種情況,編譯器會忽略這
11、條指令。26.在 C89 中,局部變量必須在代碼塊的開始處聲明,而在C99 中允許我們在 for 語句的初始化表達(dá)式中聲明變量,且這些變量的生存期只限于for 語句。27.C89 中的一些隱含規(guī)則:1聲明中不帶類型關(guān)鍵字的變量被默認(rèn)為是int 變量;2沒有聲明返回值的函數(shù)定義,其返回值默認(rèn)類型是 int ; 3如果沒有函數(shù)原型,對于傳給函數(shù)的參數(shù),整型變量默認(rèn)調(diào)整為 int 壓棧,浮點(diǎn)型默認(rèn)調(diào)整為 double 再壓棧,返回值則認(rèn)為是 int。28.C99 增加了布爾類型,用關(guān)鍵字“_Bool ”標(biāo)識, _Bool變量占用一個字節(jié),它只有兩個取值“ 1 ”和“ 0 ”,分別代表“真”和“假”。
12、例如:_Bool b = ( a b );29.C89 中,數(shù)組方括號內(nèi)必須是編譯器可求出的常數(shù)值。而在C99 中,還允許方括號里面是整型變量或整型表達(dá)式,這樣的數(shù)組稱為“變長數(shù)組”。變長是指用變量或表達(dá)式聲明(或 定義)的數(shù)組,而數(shù)組的長度(像普通數(shù)組一樣)在其生存期內(nèi)是固定不變的。30變長數(shù)組的特點(diǎn):1變長數(shù)組的 sizeof 運(yùn)算的結(jié)果要在程序?qū)嶋H運(yùn)行時才能求出;2不能在函數(shù)之外聲明或定義變長數(shù)組,因?yàn)橥獠繑?shù)組存放在數(shù)據(jù)區(qū),它們占用的空間必須在編譯期確定;3變長數(shù)組不能作為 struct 或 union 的成員,因?yàn)?struct 和 union 的大小必須 在編譯期確定,而變長數(shù)組大小
13、是在運(yùn)行期確定的;4必須保證變長數(shù)組方括號中的表達(dá)式返回整型值并且大于“0 ”,否則結(jié)果是未定義的;5方括號里的表達(dá)式的求值順序是不確定的。31.C99 新增了關(guān)鍵字“ restrict”用來修飾指針,它主要是用來通知編譯器這個指針指向的內(nèi) 存區(qū)域和其他同樣用restrict 修飾的指針指向的內(nèi)存區(qū)域不存在重疊,于是編譯器可以根據(jù)具體情況決定是否對代碼進(jìn)行優(yōu)化編譯。memcpy 函數(shù)和 memmove 函數(shù)的區(qū)別就在于memcpy 函數(shù)中兩個指針參數(shù)指向的區(qū)域不能存在重疊。32涉及類型提升時,對于同一類型,帶符號和無符號的級別是相同的。short , int, long , long long 的類型級別依次升高。33.C+編譯器會對函數(shù)的名字進(jìn)行重新編碼(修飾),如果需要調(diào)用 C 的庫函數(shù),就必須明確告訴 C+編譯器,通知它用C 語言的方式對函數(shù)名進(jìn)行修飾,如extern“ C” int test(int );34.有如下代碼:# ifdef _cplusplusexte
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 漳州職業(yè)技術(shù)學(xué)院《金融審計(jì)》2023-2024學(xué)年第二學(xué)期期末試卷
- 江西管理職業(yè)學(xué)院《中國文化概況》2023-2024學(xué)年第二學(xué)期期末試卷
- 西北民族大學(xué)《框架技術(shù)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 沈陽北軟信息職業(yè)技術(shù)學(xué)院《計(jì)算機(jī)在環(huán)境工程中的應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄭州商學(xué)院《理論力學(xué)A》2023-2024學(xué)年第二學(xué)期期末試卷
- 內(nèi)蒙古民族幼兒師范高等??茖W(xué)?!吨鞒炙囆g(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西北農(nóng)林科技大學(xué)《云計(jì)算與虛擬化技術(shù)》2023-2024學(xué)年第二學(xué)期期末試卷
- 石家莊科技職業(yè)學(xué)院《教育學(xué)專題研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 人教版初中歷史與社會七年級上冊 3.3.1耕海牧漁 教學(xué)設(shè)計(jì)
- 南昌職業(yè)大學(xué)《創(chuàng)業(yè)基礎(chǔ)創(chuàng)新教育》2023-2024學(xué)年第二學(xué)期期末試卷
- 2024下半年上海事業(yè)單位招考易考易錯模擬試題(共500題)試卷后附參考答案
- 網(wǎng)絡(luò)安全風(fēng)險評估行業(yè)研究報告
- 新能源汽車充電設(shè)施安全檢查記錄表
- GB/T 38153.1-2024印刷技術(shù)測試印樣的實(shí)驗(yàn)室制備第1部分:漿狀油墨
- 2024高考物理考試大綱
- 《上市公司財務(wù)舞弊探究的國內(nèi)外文獻(xiàn)綜述》5000字
- 2024年護(hù)師類之護(hù)士資格證考試題庫
- 腰椎間盤突出癥課件(共100張課件)
- 委托調(diào)解民事糾紛協(xié)議書合同
- 林學(xué)概論完整版本
- GB/T 44458.3-2024運(yùn)動用眼部和面部保護(hù)第3部分:水面游泳用眼鏡的要求和試驗(yàn)方法
評論
0/150
提交評論