



版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、C 學習筆記-必看知識點100 例 ( 上 )-edited by lvlv from Nov. 8,2013 to Mar. 31,20141. define 和 ifndef 的用法答:取消宏定義undef條件編譯預(yù)處理:#ifndef標識符# define標識符程序段1#else程序段2#endif它的作用是當“標識符沒有由 # d e f i n e定義過。則編譯 “ 程序段1”。否則編譯“程序段2”。注意: 條件編譯的作用是防止此頭文件被多個文件調(diào)用,產(chǎn)生編譯沖突,這里的表示符為當前頭文件名的大寫前加上_, 如果頭文件名為err.h,則標示符為_ERR_H.2. extern關(guān)鍵字的
2、用法。extern 可以置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時在其他模塊中尋找其定義。另外, extern 也可用來進行鏈接指定。3. sizeof 的結(jié)果等于對象或者類型所占的內(nèi)存字節(jié)數(shù)。4. snprintf()函數(shù)的用法。答:函數(shù)原型int snprintf(char *str, size_t size, const char *format, .);功能將可變個參數(shù)(.)按照format格式化成字符串,然后將其復(fù)制到str中。返回欲寫入的字符串長度,若出錯則返回負值。5.volatile(不穩(wěn)定的,易變的)關(guān)鍵字答: volatile i
3、=10;k=i;volatile告訴編譯器i 是隨時可能發(fā)生變化的,每次使用它的時候必須從i 的地址中讀取,因而編譯器生成的可執(zhí)行碼會重新從i的地址讀取數(shù)據(jù)放在k 中。6.strtok函數(shù)的用法。答:函數(shù)原型char *strtok(char s, const char *delim);例如: strtok("abc,def,ghi",",") ,最后可以分割成為 abc def ghi. 尤其在點分十進制的 IP 中提取應(yīng)用較多。7.MIC ?答:英特爾集成眾核(IntelMany IntegratedCore , MIC) 架構(gòu)是英特爾公司現(xiàn)有產(chǎn)品(
4、 包括英特爾至強處理器在內(nèi)) 的另一個關(guān)鍵補充。這種架構(gòu)能在一顆芯片里面支持200 多個線程同時工作。MIC 眾核協(xié)處理器Knight Corner,和之前上代Larrabee繼承者Knights Ferry不同的是,新的Knights Corner從外表上看是采用與Xeon 類似的LGA/BGA 封裝。從這點來看,集成50 個 x86 核心,運算能力達到1TFLOPS 的 Knights Corner可能會放棄 “加速卡 ”的形式,采用QPI 總線替代PCI-E 界面。7. C 語言中函數(shù)指針變量的詳細介紹答:函數(shù)指針變量的作用:指向函數(shù)入口地址,用來調(diào)用函數(shù)。使用函數(shù)指針的好處在于,可以將
5、實現(xiàn)同一功能的多個模塊統(tǒng)一起來標識,這樣一來更容易后期的維護,系統(tǒng)結(jié)構(gòu)更加清晰?;蛘邭w納為:便于分層設(shè)計、利于系統(tǒng)抽象、降低耦合度以及使接口與實現(xiàn)分開。函數(shù)指針變量定義的一般形式為:類型說明符(*指針變量名)();其中"類型說明符"表示被指函數(shù)的返回值的類型。"(*指針變量名)"表示 "*"后面的變量是定義的指針變量。最后的空括號表示指針變量所指的是一個函數(shù)。例如申明函數(shù)指針變量:int (*pf)()或者char * (*pf)();后者表示pf是一個指向函數(shù)入口的指針變量,該函數(shù)的返回值(函數(shù)值)是指針型,指向字符串。使用方法:i
6、nt max( int x, int y)pf= 函數(shù)名;(*pf)( int x, int y);頭文件的說明答: conio.h不是C 標準庫中的頭文件,在C standardlibrary, ISO C和 POSIX 標準中均沒有定義。conio是 ConsoleInput/Output(控制臺輸入輸出)的簡寫,其中定義了通過控制臺進行數(shù)據(jù)輸入和數(shù)據(jù)輸出的函數(shù),主要是一些用戶通過按鍵盤產(chǎn)生的對應(yīng)操作,比如getch()函數(shù)等等。大部分DOS ,Windows 3.x,Phar Lap ,DOSX , OS/2 orWin32 平臺上的C 編譯器提供此文件,UNIX 和 Linux平臺的c
7、 編譯器通常不包含此頭文件。如果需要使用此頭文件,可以從互聯(lián)網(wǎng)下載。conio 庫不僅適用于 Windows 平臺, 在 Linux 下也可使用 . 網(wǎng)上已經(jīng)有兼容包 , 下載后打開就可使用 ; 而至于 Mac 則完全跟 Windows 沒有區(qū)別 , 直接可以使用 .9. +i和 i+ 的效率的比較。答:簡單的比較前綴自增運算符和后綴自增運算符的效率是片面的,因為存在很多因素影響這個問題的答案。以現(xiàn)在的編譯器的優(yōu)化水平,在內(nèi)建數(shù)據(jù)類型的情況下,效率沒有區(qū)別。在自定義數(shù)據(jù)類型的情況下,+i的效率較高。10.C 語言中near 和 far關(guān)鍵字的作用?答: far 是和 near 對應(yīng)的 , 就夠
8、了 , 但是當代碼比較龐大時個地址 , 指針的本質(zhì)也是個地址就是一般程序的函數(shù)調(diào)用都在64k 地址范圍內(nèi)的, 就是16 位尋址,16位就可能不夠了.far就代表32 位尋址 , 函數(shù)的本質(zhì)就是, 所以就有了尋址的問題。11. 頭文件中stdlib.h內(nèi)容。答:stdlib.h里面定義了五種類型、一些宏和通用工具函數(shù)。類型例如size_t、wchar_t、div_t 、ldiv_t 和 lldiv_t ; 宏例如 EXIT_FAILURE 、EXIT_SUCCES 、SRAND_MA 和X MB_CUR_MAX 等等; 常用的函數(shù)如 malloc() 、calloc() 、realloc() 、
9、free() 、system() 、atoi() 、atol() 、 rand() 、 srand() 、 exit() 等等。12.#define只有宏名定義是什么意思!答 : 一般來說這樣空的宏都是為了某些手段的,例如跨平臺,比如說在windows 下我讓a 賦值為10 ,在linux下要讓a 賦值為20,那么就可以這么寫#ifdef WINDOWSa = 10;#endif#ifdef LINUXa = 20;#endif;這樣我只要在某個地方定義一個#define WINDOWS或者 #define LINUX就可以在跨平臺的情況下采取不同的策略了.#undef是在后面取消以前定義的宏
10、定義18.extern“ C” 修飾符的理解!答:被extern "C"修飾的變量和函數(shù)是按照C 語言方式編譯和連接的;19.C+ 中增加函數(shù)重載的功能的內(nèi)部原理!答: C 語言是不支持函數(shù)重載功能的,void foo( int x, int y );該函數(shù)被C 編譯器編譯后在符號庫中的名字為_foo ,而 C+ 編譯器則會產(chǎn)生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機制,生成的新名字稱為 “ mangled name ”)。_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息, C+ 就是靠這種機制來實現(xiàn)函
11、數(shù)重載的。20. 理解 C、 C+ 和 C #中變量生存期的區(qū)別!答: 應(yīng)該從作用域的角度來區(qū)分變量的生存周期,生存周期分為三種:整個程序:修飾的關(guān)鍵字有static當前文件(.c 、 .cpp 、 .cs文件): 修飾的關(guān)鍵字有:C 語言: auto (自動變量), C+ 語言:private、 protected、 public等, C #中: private、 protected、 public、 partial等。當前程序段(if語句段、函數(shù)體等): 修飾的關(guān)鍵字有:同當前文件注:函數(shù)體外定義靜態(tài)變量為全局靜態(tài)變量,函數(shù)體內(nèi)定義靜態(tài)變量為局部靜態(tài)變量,二者生存周期都是整個程序。且C 語
12、言中沒有私有和公有之分,C+ 擴充了這一個功能。21. 引用和指針的區(qū)別?答:1. 從內(nèi)存上來講系統(tǒng)為指針分配內(nèi)存空間,而引用與綁定的對象共享內(nèi)存空間,系統(tǒng)不為引用變量分配內(nèi)容空間。2 指針初始化以后可以改變指向的對象,而引用定義的時候必須要初始化,且初始化以后不允許再重新綁定對象。3. 所以引用訪問對象是直接訪問。指針訪問對象是間接訪問。4。如果pa 是指針,那么*pa 就是引用了。又如int a,&ra= a;那么 ra 就是 a 的 reference了。22. c答: h語言中頭文件、庫文件和頭文件是編譯時必須的,.clib文件的聯(lián)系與區(qū)別。是鏈接時需要的,dll是運行時需要的
13、。附加依賴項的是.lib不是 .dll的編譯和鏈接,有頭文件和lib在開發(fā)和調(diào)試階段,當然最好都有。,若生成了DLL, 則肯定也生成LIB文件。如果要完成源代碼就夠了。如果也使動態(tài)連接的程序運行起來,有 dll就夠了。23.C 語言中編譯鏈接的過程!答: obj 文件是目標文件,一般是程序編譯后的二進制文件,在通過鏈接器和資源文件鏈接就成 exe 文件了。OBJ只給出了程序的相對地址,而EXE是絕對地址。OBJ文件不支持有孔的多邊形面。24. 常見字符編碼有:ASCII 編碼 ( American Standard Code for Information Interchange)基本的ASC
14、II字符集共有 128 個字符,包括常用的字母、數(shù)字、標點符號等,一個字節(jié)來存放一個ASCII字符。BIG-5 碼: 是通行于臺灣、香港地區(qū)的一個繁體字編碼方案,俗稱“大五碼 ”。GB2312 編碼:對 ASCII編碼的擴充,收錄簡體中文和常用字符,通用于中國大陸。每個漢字占用兩個字節(jié)?;炯彩杖霛h字6763 個和非漢字圖形字符682 個。對于人名、古漢語等方面出現(xiàn)的罕用字,GB 2312不能處理,這導(dǎo)致了后來GBK 及 GB 18030漢字字符集的出現(xiàn)。GBK 編碼 :對GB2312 的擴充,收錄了繁體中文,簡、繁體字融于一庫,每個漢字占用兩個字節(jié)。Unicode 編碼:注意,Unicod
15、e 只是一個編碼規(guī)范,目前實際實現(xiàn)的unicode 編碼只要有三種: UTF-8,UCS-2和 UTF-16 。 Unicode 當然是一個很大的集合,現(xiàn)在的規(guī)??梢匀菁{100 多萬個符號。Unicode 固然統(tǒng)一了編碼方式,但是它的效率不高,比如UCS-4(Unicode 的標準之一 ) 規(guī)定用4 個字節(jié)存儲一個符號,那么每個英文字母前都必然有三個字節(jié)是0 ,這對存儲和傳輸來說都很耗資源。UTF-8 編碼: UTF-8 是一種 8 位的 unicode字符集,編碼長度是可變的,并且是ASCII 字符集的嚴格超集,也就是說ASCII 中每個字符的編碼在UTF-8中 是完全一樣的。UTF-8 字
16、符集中,一個字符可能是1 個字節(jié), 2 個字節(jié), 3 個字節(jié)或者4個字節(jié)長。一般來說,歐洲的字母字符長度為1 到 2個字節(jié),而亞洲的大部分字符則是3個字節(jié),附加字符為4 個字節(jié)長。UCS-2 編碼:UCS-2 是固定長度為16 位的unicode字符集。每個字符都是2 個字節(jié),UCS-2只支持unicode3.0,所以不支持附加字符。UCS-2 的優(yōu)點:對于亞洲字符的存儲空間需求比UTF-8 少,因為每個字符都是2 個字節(jié)。處理字符的速度比UTF-8 更快,因為是固定長度編碼的。對于windows和 java的支持更好。UTF-16 編碼:UTF-16 也是一種16 位編碼的字符集。實際上,U
17、TF-16 就是UCS-2 加上附加字符的支持,也就是符合unicode4.0規(guī)范的UCS-2 。所以UTF-16 是 UCS-2 的嚴格超集。UTF-16 中的字符,要么是2 個字節(jié),要么是4 個字節(jié)表示的。UTF-16 主要在windows2000以上版本使用。UTF-16 相對UTF-8 的優(yōu)點,和UCS-2 是一致的??偨Y(jié): 在亞洲進行在web 開發(fā)時,面向的是全球,使用UTF-8 編碼是絕對沒有錯的,面向亞洲的話,使用 UCS-2 和 UTF 編碼效率會更高。 綜上所述,使用 UTF-8 編碼絕對沒有錯,不會出現(xiàn)編碼亂碼的現(xiàn)象。25.Sql Sever中 char 、 varchar
18、、 nchar和 nvarchar的對比區(qū)別!答: ncahr和 nvarchar采用unicode編碼,固定每個字符占用兩個字節(jié),char和 varchar固定每個字符采用一個字節(jié)。所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數(shù)字,用 char/varchar我把他們的區(qū)別概括成:CHAR , NCHAR 定長,速度快,占空間大,需處理VARCHA ,R NVARCHA ,RTEXT 不定長,空間小,速度慢,無需處理。注意: 操作系統(tǒng)的語言環(huán)境支持中文可以使用char和 varchar,如果操作系統(tǒng)環(huán)境不支持中文,必須使用nvarchar和 ncahr 。請協(xié)
19、調(diào)好存儲代價和兼容性之間的關(guān)系。26.MD5 利用 salt進行加密的過程程?用戶輸入【賬號】和【密碼】(以及其他用戶信息);系統(tǒng)為用戶生成【Salt 值】;系統(tǒng)將【 Salt 值】和【用戶密碼】連接到一起;對連接后的值進行散列,得到【Hash 值】;將【 Hash 值 1】和【 Salt 值】分別放到數(shù)據(jù)庫中。用戶登錄時,用戶輸入【賬號】和【密碼】;系統(tǒng)通過用戶名找到與之對應(yīng)的【Hash 值】和【Salt 值】;系統(tǒng)將【 Salt 值】和【用戶輸入的密碼】連接到一起;對連接后的值進行散列,得到【Hash 值 2】(注意是即時運算出來的值);比較【 Hash 值 1】和【 Hash 值 2】是
20、否相等,相等則表示密碼正確,否則表示密碼錯誤。有時候,為了減輕開發(fā)壓力,程序員會統(tǒng)一使用一個salt 值(儲存在某個地方),而不是每個用戶都生成私有的salt 值。27.MD5 簡介!答: Message DigestAlgorithmMD5 (中文名為消息摘要算法第五版)為計算機安全領(lǐng)域廣泛使用的一種散列函數(shù), 用以提供消息的完整性保護。 用于確保信息傳輸完整一致。機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法) ,主流編程語言普遍已有是計算MD5 實現(xiàn)算法原理:對為個MD5 算法簡要的敘述可以為:MD5 以 512 位分組來處理輸入的信息,且每一分組又被劃分16 個 32 位子分組,經(jīng)過
21、了一系列的處理后,算法的輸出由四個32 位分組組成,將這四32 位分組級聯(lián)后單目運算符28.C 語言中運算符的優(yōu)先級別!30. alloca ,malloc、calloc和realloc的理解!答: alloca() 是分配在棧上,calloc()”是”分配內(nèi)存給多個對象”,”配內(nèi)存給一個對象”,”realloc()”是” 重新分配內(nèi)存 ”之意。” free()malloc() ”是 ”分”就比較簡單了, ”釋放 ”的意思,就是把之前所分配的內(nèi)存空間給釋放出來。參數(shù)均為以字節(jié)為單位。注意: alloca 不具可移植性,而且在沒有傳統(tǒng)堆棧的機器上很難實現(xiàn)。當它的返回值直接傳入另一個函數(shù)時會帶來問
22、題,因為他分配在棧上。31.strstr(char *str1, char *str2)和 strchr(const char *s,char c)答:是分別求字符串和字符在前面字符串中第一次出現(xiàn)的地址的指針,返回的地址是字符串在內(nèi)存中隨機分配的地址再加上你所搜索的字符在字符串位置,的分別和用法!指針的內(nèi)容就是地址,如果s中不存在c 則返回NULL 。32. strcpy和 memcpy 主要有以下3 方面的區(qū)別。1、復(fù)制的內(nèi)容不同。strcpy只能復(fù)制字符串,而memcpy可以復(fù)制任意內(nèi)容,例如字符數(shù)組、整型、結(jié)構(gòu)體、類等。2、復(fù)制的方法不同。strcpy不需要指定長度,它遇到被復(fù)制字符的串
23、結(jié)束符所以容易溢出。memcpy 則是根據(jù)其第3 個參數(shù)決定復(fù)制的長度。"0"才結(jié)束,3、用途不同。 通常在復(fù)制字符串時用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時則一般用memcpy 。33. 函數(shù)指針的用法答:函數(shù)指針的定義:/申明函數(shù)指針pfint (*pf)(const int&, const int&);/ 具體函數(shù)intintCompare(constint& aInt,constint& bInt)可將函數(shù)指針pf 指向函數(shù)intComparepf = intCompare;調(diào)用:/使用pfif(pf(aInt, bInt) = 0
24、)cout <<"two integers are equal"<<"."<< endl;或者用pf 來申明其他的函數(shù)指針:/定義函數(shù)指針類型cmpFuntypedefint(*cmpFun)(cmpFun pf= intCompareconstint ;表示:&,pfconstint 指向函數(shù)&);intCompare();/ 函數(shù)名可以作為參數(shù),申明形式是函數(shù)指針作為參數(shù),其做法為intplusFun(int& aInt,int (*paf2)(constint&,constint&
25、amp;)intbInt = 1;intcInt = 2;returnaInt + paf2(bInt, cInt);函數(shù)指針作為返回值一個函數(shù)的返回值可以是一個函數(shù)指針,這個聲明形式寫起來有點麻煩:/ 函數(shù)指針作為返回值int(*retFunPointer(int)(constint&,constint&);上面的聲明的含義:a)retFunPointer是一個函數(shù),該函數(shù)有一個int類型的參數(shù);b)retFunPointer返回值是一個函數(shù)指針,它指向的是帶有兩個const int&類型參數(shù),且返回類型為int的函數(shù)。retFunPointer的定義:/函數(shù)指針為返
26、回值,整個函數(shù)名為retFunPointer,把自己裝扮成函數(shù)指針,作為返回值。int(*retFunPointer(intaInt)(constint&,constint&)cout << aInt << endl;/ pf已經(jīng)在前面定義過了returnpf;調(diào)用代碼示例:/函數(shù)指針作為返回值,retFunPointer返回一個cmpFun 類型的函數(shù)指針cmpFun pf3 = retFunPointer(aaInt);intresult = pf3(aaInt, bbInt);cout << result << endl;3
27、4. 注意:答: C語言中,頭文件中include的頭文件內(nèi)申明的函數(shù),在當前.c文件中,是可以間接調(diào)用的!35. 注意答: C 語言中沒有bool類型,用0 和 1 來表示真假!C 語言和 C+ 都是強類型的,變量在申明時候就要指定類型,而不是等編譯器根據(jù)編譯時候所賦的值來確定其便編譯時的類型。36.MD5 算法原理簡介!答:對MD5 算法簡要的敘述可以為:MD5 以 512 位分組來處理輸入的信息,且每一分組又被劃分為16 個 32 位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個32 位分組組成,將這四個32 位分組級聯(lián)后將生成一個128 位散列值。也就是32 個十六進制的字符,每個字符
28、占 4 位從0 到 f ,均為小寫,因此叫做128 位散列值。37. strncmp()函數(shù)簡介答:用 法 : int strncmp(char *str1, char *str2, int maxlen);說明 : 此函數(shù)功能即比較字符串 str1 和 str2 的前 maxlen 個字符。如果前maxlen字節(jié) 完全相等, 返回值就 =0;在前 maxlen 字節(jié)比較過程中,如果出現(xiàn) str1n與 str2n不等, 則返回( str1n-str2n) 1。38.<< 和 >> 和 >>> 這三個運算符號的理解答:<<( 左移 )運算規(guī)則
29、:按二進制形式把所有的數(shù)字向左移動對應(yīng)的位數(shù),高位移出( 舍棄)數(shù)學意義:在數(shù)字沒有溢出的前提下,對于正數(shù) 和 負數(shù) ,左移一位都相當于乘以位就相當于乘以2 的 n 次方。,低位的空位補零。2 的1 次方,左移n>>( 帶符號右移)運算規(guī)則:按二進制形式把所有的數(shù)字向右移動對應(yīng)的位數(shù),低位移出( 舍棄 ) ,高位的空位補符號位,即正數(shù)補零,負數(shù)補1。數(shù)學意義:右移一位相當于除2,右移n 位相當于除以2 的 n 次方。這里是取商哈,余數(shù) 就不要了。>>>( 無符號右移)運算規(guī)則:按二進制形式把所有的數(shù)字向右移動對應(yīng)位數(shù),低位移出( 舍棄 ) ,高位的空位補零。對于正
30、數(shù)來說和帶符號右移相同,對于負數(shù)來說不同。其他結(jié)構(gòu)和>>相似。39.getch()函數(shù)和getchar()函數(shù)的區(qū)別答: getch():所在頭文件:conio.h函數(shù)用途:從控制臺讀取一個字符,但不顯示在屏幕上, 然后程序繼續(xù)執(zhí)行下去。getchar()函數(shù):所在頭文件時stdio.h函數(shù)用途: 用戶按下字符后,等待用戶按下回車,然后繼續(xù)執(zhí)行,且返回值顯示在屏幕上。40. 注意strlen()函數(shù)求字符串長度的時候不會講結(jié)尾符號0 算進去。substr() 函數(shù)是 C+ 中的函數(shù), C 語言中沒有這個函數(shù),要想實現(xiàn)這個功能,可以使用 strncpy() 或者 memcpy 來實現(xiàn)
31、。41.strncpy()和 memcpy() 的區(qū)別答:二者都可指定長度來實現(xiàn)串的拷貝。不同點是當然有區(qū)別,strncpy()時拷貝字符串,memcpy() 是拷貝內(nèi)存內(nèi)容,可以拷貝其他類型的數(shù)據(jù)。42.sizeof()函數(shù)答: sizeof是運算符,可用于任何變量名、類型名或常量值,當用于變量名(不是數(shù)組名)或常量時,它不需要用圓括號。它在編譯時起作用,而不是運行時。sizeof的結(jié)果等于對象或者類型所占的內(nèi)存字節(jié)數(shù), 包括字符串的結(jié)尾符0,strlen()求字符串的長度不包括結(jié)尾符0 。43.memet()函數(shù),解決內(nèi)存內(nèi)存空間出現(xiàn)屯屯屯屯屯屯和燙燙燙燙燙燙亂碼答: void *mems
32、et(void *s, char ch,size_tn);將 s 所指向的某一塊內(nèi)存中的每個字節(jié) 的內(nèi)容全部設(shè)置為ch 指定的ASCII 值, 塊的大小由第三個參數(shù)指定,這個函數(shù)通常為新申請的內(nèi)存做初始化工作,其返回值為指向S 的指針。其中 void*s 空指針,指針不指向任何地址空間。初始化內(nèi)存地址空間后就會解決亂碼問題,用 memset(s,NULL,sizeof(s).亂碼問題是因為使用malloc()申請的內(nèi)存空間沒有初始化,默認賦值0xcc ,打印出來就是屯屯屯,malloc申請的空間是在" 堆 " 上的,可手動釋放。使用 alloca()申請內(nèi)存會產(chǎn)生燙燙燙燙燙
33、燙,與malloc,calloc,realloc類似,但是注意一個重要的區(qū)別,_alloca是在棧 (stack)上申請空間, 用完馬上就釋放,無需手動釋放。44. c語言中定義變量不賦初值默認是多少?答: C 語言中 , 沒有加 static 默認為 auto 果加了 static, 不給初值的變量的初值是默認是只是它不代表任何地址。型此時不給初值的變量的初值是隨機的0,指針也是一樣,其實NULL, 但是的值就是如0 ,45.C 語言從源碼到可執(zhí)行程序的四個過程答:預(yù)處理 ( 也稱預(yù)編譯, Preprocessing):C 語言的預(yù)處理主要有三個方面的內(nèi)容:1.宏定義;2. 文件包含;3.條
34、件編譯。預(yù)處理命令以符號 “ #”開頭,這個方面本質(zhì)是將需要的代碼包含到當前的.c文件中。編譯 (Compilation):編譯所做的工作就是詞法分析,語法分析,在進行匯編成中間代碼,匯編代碼。匯編 (Assembly):匯編實際上指把匯編語言代碼翻譯成目標機器指令的過程。經(jīng)過這一處理而得到相應(yīng)的目標文件。目標文件中所存放的也就是與源程序等效的目標的機器語言代碼。目標文件由段組成。通常一個目標文件中至少有兩個段:代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執(zhí)行的,但一般卻不可寫。數(shù)據(jù)段:主要存放程序中要用到的各種全局變量或靜態(tài)的數(shù)據(jù)。一般數(shù)據(jù)段都是可讀,可寫,可執(zhí)行的。鏈接 (L
35、inking):鏈接程序的主要工作就是將有關(guān)的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成為一個能夠誒操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。鏈接過程分為靜態(tài)鏈接和動態(tài)鏈接。靜態(tài)鏈接是指連接程序從靜態(tài)鏈接庫中拷貝需要的代碼到被執(zhí)行的程序中,動態(tài)鏈接是指代碼被放到稱作是動態(tài)鏈接庫或共享對象的某個目標文件中,鏈接程序此時所作的只是在最終的可執(zhí)行程序中記錄下共享對象的名字以及其它少量的登記信息。 在此可執(zhí)行文件被執(zhí)行時,動態(tài)鏈接庫的全部內(nèi)容將被映射到運行時相應(yīng)進程的虛地址空間。動態(tài)鏈接程序?qū)⒏鶕?jù)可執(zhí)行程序中記錄的信息找到相應(yīng)的函數(shù)代碼。46.G
36、CC 編譯器編譯的過程答:實質(zhì)上, GCC 的編譯過程是分為四個階段進行的,即預(yù)處理編譯 (Compilation)、匯編(Assembly)和連接(Linking)。(也稱預(yù)編譯,Preprocessing)、一步到位編譯:gcc test.c -o test.out輸出可執(zhí)行文件test.out預(yù)處理:gcc -E test.c -o test.i或gcc -E test.c編譯為匯編代碼(Compilation): gcc -S test.i -o test.s匯編 (Assembly): gcc -c test.s -o test.o,編譯成目標文件test.o。連接 (Linking
37、): gcc test.o -o test.out47. C 語言程序調(diào)試的常見錯誤分析與解決辦法答: C 語言程序的編譯是以.c 文件為單位進行編譯的,生成.obj二進制目標文件,最后在鏈接成可執(zhí)行文件。編譯提示的錯誤:編譯的時候進行詞法分析和語法分析,此時書寫不符合語法規(guī)則或者未定義會進行報錯,這種錯誤容易處理。鏈接提示的錯誤: 經(jīng)常會出現(xiàn)某函數(shù)已經(jīng)在 main.obj 預(yù)處理的條件編譯就發(fā)揮作用了, 可以防止重復(fù)編譯。文件中定義,出現(xiàn)重復(fù)編譯。這時候但是, 作用只能是防止變量的申明的重復(fù)編譯,而不能防止變量的定義的重復(fù)編譯。也就是說,在頭文件中定義了函數(shù)之后,在不同的 .c 文件引入頭文
38、件中,兩個.c文件生成的obj文件中都會含有對函數(shù)體代碼的目標代碼。原因是, 我個人理解是, 條件編譯之所以對頭文件中定義的函數(shù)不能起到防止重復(fù)編譯的功能,是因為函數(shù)體的實現(xiàn)代碼編譯后最終是要存入obj目標文件中的,編譯是以 .c文件為單位的,每個.c 文件都會被編譯成.obj文件,但是 .h文件中不能編譯成obj文件,因此其函數(shù)的定義部分,即實現(xiàn)部分一定要編譯成目標代碼存入 obj文件,供鏈接時使用。但是當兩個 .c 文件同時引用頭文件時,兩個.c 文件都可包含函數(shù)實現(xiàn)部分的代碼的目標代碼,編譯器沒有規(guī)定將函數(shù)代碼的目標代碼存入哪個.c 文件,只能兩個同時包含,這就導(dǎo)致了鏈接時出現(xiàn)的重復(fù)定義
39、的問題。解決的辦法就是不要在頭文件中定義變量,只能申明?;蛘咧荒茏屢粋€ .c 文件引用含有定義變量的頭文件,或者用static來修飾函數(shù),定義為全局靜態(tài)類型函數(shù),這樣的話函數(shù)代碼就會被存到全局/ 靜態(tài)存儲區(qū),編譯時只會被編譯一次,若非 static靜態(tài)全局變量,函數(shù)被包含進.c文件后,就變成了當前.c 文件的全局變量,而不是整個程序的全局變量,這就導(dǎo)致了每個.c文件把它當做自己的函數(shù)來進行編譯,將目標代碼存入自己的obj 文件中,鏈接時就會出錯。48.C/C+ 語言中程序在內(nèi)存中的分區(qū)情況答:在 C+ 中,內(nèi)存分成 5 個區(qū),他們分別是堆、棧、自由存儲區(qū)、全局 / 靜態(tài)存儲區(qū)和常量存儲區(qū)。棧區(qū)
40、 ,就是那些由編譯器在需要的時候分配,在不需要的時候自動清除的變量的存儲區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等。堆區(qū) ,就是那些由 new 分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個 new 就要對應(yīng)一個 delete 。如果程序員沒有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會自動回收。程序代碼區(qū) 存放函數(shù)體的二進制代碼。全局 / 靜態(tài)存儲區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C 語言中,全局變量又分為初始化的和未初始化的,在C+ 里面沒有這個區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。常量存儲區(qū),這是一塊比較特殊的存儲區(qū),他們里面存放的是常量,不允許修改50.C
41、語言中sizeof()不能用來求指針指向的內(nèi)存空間的大小答: *output=(char*)alloca(23*sizeof( char );sizeof(output);求得的不是指針output指向的內(nèi)存的地址空間的大小,而是指針變量本身所占的內(nèi)存空間大小,為 4 個字節(jié)。指針和數(shù)組是不一樣的,但數(shù)組做為參數(shù)傳遞時就會退化為同類型的指針. str是數(shù)組擁有固定的內(nèi)存sizeof是計算它占的字節(jié)數(shù), 而指針只是一個存放變量地址的一個變量在任何時候都是占四個字節(jié).51.C語言中不能用用strlen(),來求指針指向內(nèi)存空間的長度,初始化后的指針字符串才可以答 : 因為strlen()函數(shù)是用來
42、計算字符串的長度,是以NULL 來表示的字符串結(jié)尾的標志,如果沒有0 這個字符的話,strlen()統(tǒng)計出來的長度是不正確的。52. C 語言中函數(shù)的變參問題答: C 語言中輸入和輸出格式控制函數(shù)的參數(shù)實現(xiàn)不定的變化,是在C 語言中解決變參問題的一組宏,所在頭文件:其實現(xiàn)的機理是因為VA_LIST#include <stdarg.h>。具體請參見百,度百科。53.8086/8088處理器中段的首地址,基址和偏移地址從哪獲取答:物理地址段基址*16+ 偏移地址段的首地址就是段的基地址,等于段寄存器的內(nèi)容*16 。段寄存器分為C S(代碼段, Code Segment )、DS (數(shù)據(jù)
43、段, Data Segment)、SS(堆棧段,Stack Segment)和 ES (附加段數(shù)據(jù),Extra Segment )寄存器。當進行讀 / 寫存儲器操作數(shù)或者訪問變量時,自動選擇DS 或者 ES 寄存器作為段基址。DS 偏移地址對應(yīng)SI( Source Index源變址寄存器)、 DI( Destination Index目的變址寄存器)CS 偏移地址對應(yīng)IP(指針寄存器 )SS 偏移地址對應(yīng)B(P基址指針寄存器Base Pointer)或 S(P 堆棧指針寄存器Stack Pointer )ES 偏移地址對應(yīng)DI( Destination Index目的變址寄存器)53.C 語言中地址尋址與處理器的關(guān)系答: 8080 的地址線是16條, 8086/8088 的地址線有20 條, 80286 的地址
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 重大接待培訓
- 培訓人事文員
- 公司食堂員工培訓
- 員工財務(wù)培訓
- 培訓企業(yè)價值觀
- 醫(yī)院護理人力資源管理配置
- 全身多處軟組織損傷的護理
- 愛清潔講衛(wèi)生健康最美麗
- 神內(nèi)科護理常規(guī)
- 2025年企業(yè)可持續(xù)發(fā)展目標(SDGs)與海洋資源保護報告
- 強夯試夯的施工組織方案
- 福建高考名著《紅樓夢》填空題+答案
- 2019北師大版高中英語選擇性必修一單詞表
- 商標法期末復(fù)習
- 機械優(yōu)化設(shè)計_經(jīng)典實例PPT課件
- 材料力學計算試題(庫)完整
- 投資控股集團有限公司安全生產(chǎn)責任制暫行辦法
- 智慧工廠解決方案—燈塔工廠引領(lǐng)制造業(yè)數(shù)字化轉(zhuǎn)型-白皮書
- 2019-2020學年廣東省廉江市實驗學校北師大版五年級下冊期末復(fù)習數(shù)學試卷2
- 2019第五版新版PFMEA 注塑實例
- GB_T 40081-2021 電梯自動救援操作裝置(高清-現(xiàn)行)
評論
0/150
提交評論