C語言學(xué)習(xí)筆記(必看知識(shí)點(diǎn))_第1頁
C語言學(xué)習(xí)筆記(必看知識(shí)點(diǎn))_第2頁
C語言學(xué)習(xí)筆記(必看知識(shí)點(diǎn))_第3頁
C語言學(xué)習(xí)筆記(必看知識(shí)點(diǎn))_第4頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C 學(xué)習(xí)筆記-必看知識(shí)點(diǎn)100 例 ( 上 )-edited by lvlv from Nov. 8,2013 to Mar. 31,20141. define 和 ifndef 的用法答:取消宏定義undef條件編譯預(yù)處理:#ifndef標(biāo)識(shí)符# define標(biāo)識(shí)符程序段1#else程序段2#endif它的作用是當(dāng)“標(biāo)識(shí)符沒有由 # d e f i n e定義過。則編譯 “ 程序段1”。否則編譯“程序段2”。注意: 條件編譯的作用是防止此頭文件被多個(gè)文件調(diào)用,產(chǎn)生編譯沖突,這里的表示符為當(dāng)前頭文件名的大寫前加上_, 如果頭文件名為err.h,則標(biāo)示符為_ERR_H.2. extern關(guān)鍵字的

2、用法。extern 可以置于變量或者函數(shù)前,以表示變量或者函數(shù)的定義在別的文件中,提示編譯器遇到此變量和函數(shù)時(shí)在其他模塊中尋找其定義。另外, extern 也可用來進(jìn)行鏈接指定。3. sizeof 的結(jié)果等于對(duì)象或者類型所占的內(nèi)存字節(jié)數(shù)。4. snprintf()函數(shù)的用法。答:函數(shù)原型int snprintf(char *str, size_t size, const char *format, .);功能將可變個(gè)參數(shù)(.)按照format格式化成字符串,然后將其復(fù)制到str中。返回欲寫入的字符串長(zhǎng)度,若出錯(cuò)則返回負(fù)值。5.volatile(不穩(wěn)定的,易變的)關(guān)鍵字答: volatile i

3、=10;k=i;volatile告訴編譯器i 是隨時(shí)可能發(fā)生變化的,每次使用它的時(shí)候必須從i 的地址中讀取,因而編譯器生成的可執(zhí)行碼會(huì)重新從i的地址讀取數(shù)據(jù)放在k 中。6.strtok函數(shù)的用法。答:函數(shù)原型char *strtok(char s, const char *delim);例如: strtok("abc,def,ghi",",") ,最后可以分割成為 abc def ghi. 尤其在點(diǎn)分十進(jìn)制的 IP 中提取應(yīng)用較多。7.MIC ?答:英特爾集成眾核(IntelMany IntegratedCore , MIC) 架構(gòu)是英特爾公司現(xiàn)有產(chǎn)品(

4、 包括英特爾至強(qiáng)處理器在內(nèi)) 的另一個(gè)關(guān)鍵補(bǔ)充。這種架構(gòu)能在一顆芯片里面支持200 多個(gè)線程同時(shí)工作。MIC 眾核協(xié)處理器Knight Corner,和之前上代Larrabee繼承者Knights Ferry不同的是,新的Knights Corner從外表上看是采用與Xeon 類似的LGA/BGA 封裝。從這點(diǎn)來看,集成50 個(gè) x86 核心,運(yùn)算能力達(dá)到1TFLOPS 的 Knights Corner可能會(huì)放棄 “加速卡 ”的形式,采用QPI 總線替代PCI-E 界面。7. C 語言中函數(shù)指針變量的詳細(xì)介紹答:函數(shù)指針變量的作用:指向函數(shù)入口地址,用來調(diào)用函數(shù)。使用函數(shù)指針的好處在于,可以將

5、實(shí)現(xiàn)同一功能的多個(gè)模塊統(tǒng)一起來標(biāo)識(shí),這樣一來更容易后期的維護(hù),系統(tǒng)結(jié)構(gòu)更加清晰?;蛘邭w納為:便于分層設(shè)計(jì)、利于系統(tǒng)抽象、降低耦合度以及使接口與實(shí)現(xiàn)分開。函數(shù)指針變量定義的一般形式為:類型說明符(*指針變量名)();其中"類型說明符"表示被指函數(shù)的返回值的類型。"(*指針變量名)"表示 "*"后面的變量是定義的指針變量。最后的空括號(hào)表示指針變量所指的是一個(gè)函數(shù)。例如申明函數(shù)指針變量:int (*pf)()或者char * (*pf)();后者表示pf是一個(gè)指向函數(shù)入口的指針變量,該函數(shù)的返回值(函數(shù)值)是指針型,指向字符串。使用方法:i

6、nt max( int x, int y)pf= 函數(shù)名;(*pf)( int x, int y);頭文件的說明答: conio.h不是C 標(biāo)準(zhǔn)庫中的頭文件,在C standardlibrary, ISO C和 POSIX 標(biāo)準(zhǔn)中均沒有定義。conio是 ConsoleInput/Output(控制臺(tái)輸入輸出)的簡(jiǎn)寫,其中定義了通過控制臺(tái)進(jìn)行數(shù)據(jù)輸入和數(shù)據(jù)輸出的函數(shù),主要是一些用戶通過按鍵盤產(chǎn)生的對(duì)應(yīng)操作,比如getch()函數(shù)等等。大部分DOS ,Windows 3.x,Phar Lap ,DOSX , OS/2 orWin32 平臺(tái)上的C 編譯器提供此文件,UNIX 和 Linux平臺(tái)的c

7、 編譯器通常不包含此頭文件。如果需要使用此頭文件,可以從互聯(lián)網(wǎng)下載。conio 庫不僅適用于 Windows 平臺(tái), 在 Linux 下也可使用 . 網(wǎng)上已經(jīng)有兼容包 , 下載后打開就可使用 ; 而至于 Mac 則完全跟 Windows 沒有區(qū)別 , 直接可以使用 .9. +i和 i+ 的效率的比較。答:簡(jiǎn)單的比較前綴自增運(yùn)算符和后綴自增運(yùn)算符的效率是片面的,因?yàn)榇嬖诤芏嘁蛩赜绊戇@個(gè)問題的答案。以現(xiàn)在的編譯器的優(yōu)化水平,在內(nèi)建數(shù)據(jù)類型的情況下,效率沒有區(qū)別。在自定義數(shù)據(jù)類型的情況下,+i的效率較高。10.C 語言中near 和 far關(guān)鍵字的作用?答: far 是和 near 對(duì)應(yīng)的 , 就夠

8、了 , 但是當(dāng)代碼比較龐大時(shí)個(gè)地址 , 指針的本質(zhì)也是個(gè)地址就是一般程序的函數(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只有宏名定義是什么意思!答 : 一般來說這樣空的宏都是為了某些手段的,例如跨平臺(tái),比如說在windows 下我讓a 賦值為10 ,在linux下要讓a 賦值為20,那么就可以這么寫#ifdef WINDOWSa = 10;#endif#ifdef LINUXa = 20;#endif;這樣我只要在某個(gè)地方定義一個(gè)#define WINDOWS或者 #define LINUX就可以在跨平臺(tái)的情況下采取不同的策略了.#undef是在后面取消以前定義的宏

10、定義18.extern“ C” 修飾符的理解!答:被extern "C"修飾的變量和函數(shù)是按照C 語言方式編譯和連接的;19.C+ 中增加函數(shù)重載的功能的內(nèi)部原理!答: C 語言是不支持函數(shù)重載功能的,void foo( int x, int y );該函數(shù)被C 編譯器編譯后在符號(hào)庫中的名字為_foo ,而 C+ 編譯器則會(huì)產(chǎn)生像_foo_int_int之類的名字(不同的編譯器可能生成的名字不同,但是都采用了相同的機(jī)制,生成的新名字稱為 “ mangled name ”)。_foo_int_int這樣的名字包含了函數(shù)名、函數(shù)參數(shù)數(shù)量及類型信息, C+ 就是靠這種機(jī)制來實(shí)現(xiàn)函

11、數(shù)重載的。20. 理解 C、 C+ 和 C #中變量生存期的區(qū)別!答: 應(yīng)該從作用域的角度來區(qū)分變量的生存周期,生存周期分為三種:整個(gè)程序:修飾的關(guān)鍵字有static當(dāng)前文件(.c 、 .cpp 、 .cs文件): 修飾的關(guān)鍵字有:C 語言: auto (自動(dòng)變量), C+ 語言:private、 protected、 public等, C #中: private、 protected、 public、 partial等。當(dāng)前程序段(if語句段、函數(shù)體等): 修飾的關(guān)鍵字有:同當(dāng)前文件注:函數(shù)體外定義靜態(tài)變量為全局靜態(tài)變量,函數(shù)體內(nèi)定義靜態(tài)變量為局部靜態(tài)變量,二者生存周期都是整個(gè)程序。且C 語

12、言中沒有私有和公有之分,C+ 擴(kuò)充了這一個(gè)功能。21. 引用和指針的區(qū)別?答:1. 從內(nèi)存上來講系統(tǒng)為指針分配內(nèi)存空間,而引用與綁定的對(duì)象共享內(nèi)存空間,系統(tǒng)不為引用變量分配內(nèi)容空間。2 指針初始化以后可以改變指向的對(duì)象,而引用定義的時(shí)候必須要初始化,且初始化以后不允許再重新綁定對(duì)象。3. 所以引用訪問對(duì)象是直接訪問。指針訪問對(duì)象是間接訪問。4。如果pa 是指針,那么*pa 就是引用了。又如int a,&ra= a;那么 ra 就是 a 的 reference了。22. c答: h語言中頭文件、庫文件和頭文件是編譯時(shí)必須的,.clib文件的聯(lián)系與區(qū)別。是鏈接時(shí)需要的,dll是運(yùn)行時(shí)需要的

13、。附加依賴項(xiàng)的是.lib不是 .dll的編譯和鏈接,有頭文件和lib在開發(fā)和調(diào)試階段,當(dāng)然最好都有。,若生成了DLL, 則肯定也生成LIB文件。如果要完成源代碼就夠了。如果也使動(dòng)態(tài)連接的程序運(yùn)行起來,有 dll就夠了。23.C 語言中編譯鏈接的過程!答: obj 文件是目標(biāo)文件,一般是程序編譯后的二進(jìn)制文件,在通過鏈接器和資源文件鏈接就成 exe 文件了。OBJ只給出了程序的相對(duì)地址,而EXE是絕對(duì)地址。OBJ文件不支持有孔的多邊形面。24. 常見字符編碼有:ASCII 編碼 ( American Standard Code for Information Interchange)基本的ASC

14、II字符集共有 128 個(gè)字符,包括常用的字母、數(shù)字、標(biāo)點(diǎn)符號(hào)等,一個(gè)字節(jié)來存放一個(gè)ASCII字符。BIG-5 碼: 是通行于臺(tái)灣、香港地區(qū)的一個(gè)繁體字編碼方案,俗稱“大五碼 ”。GB2312 編碼:對(duì) ASCII編碼的擴(kuò)充,收錄簡(jiǎn)體中文和常用字符,通用于中國(guó)大陸。每個(gè)漢字占用兩個(gè)字節(jié)?;炯彩杖霛h字6763 個(gè)和非漢字圖形字符682 個(gè)。對(duì)于人名、古漢語等方面出現(xiàn)的罕用字,GB 2312不能處理,這導(dǎo)致了后來GBK 及 GB 18030漢字字符集的出現(xiàn)。GBK 編碼 :對(duì)GB2312 的擴(kuò)充,收錄了繁體中文,簡(jiǎn)、繁體字融于一庫,每個(gè)漢字占用兩個(gè)字節(jié)。Unicode 編碼:注意,Unicod

15、e 只是一個(gè)編碼規(guī)范,目前實(shí)際實(shí)現(xiàn)的unicode 編碼只要有三種: UTF-8,UCS-2和 UTF-16 。 Unicode 當(dāng)然是一個(gè)很大的集合,現(xiàn)在的規(guī)模可以容納100 多萬個(gè)符號(hào)。Unicode 固然統(tǒng)一了編碼方式,但是它的效率不高,比如UCS-4(Unicode 的標(biāo)準(zhǔn)之一 ) 規(guī)定用4 個(gè)字節(jié)存儲(chǔ)一個(gè)符號(hào),那么每個(gè)英文字母前都必然有三個(gè)字節(jié)是0 ,這對(duì)存儲(chǔ)和傳輸來說都很耗資源。UTF-8 編碼: UTF-8 是一種 8 位的 unicode字符集,編碼長(zhǎng)度是可變的,并且是ASCII 字符集的嚴(yán)格超集,也就是說ASCII 中每個(gè)字符的編碼在UTF-8中 是完全一樣的。UTF-8 字

16、符集中,一個(gè)字符可能是1 個(gè)字節(jié), 2 個(gè)字節(jié), 3 個(gè)字節(jié)或者4個(gè)字節(jié)長(zhǎng)。一般來說,歐洲的字母字符長(zhǎng)度為1 到 2個(gè)字節(jié),而亞洲的大部分字符則是3個(gè)字節(jié),附加字符為4 個(gè)字節(jié)長(zhǎng)。UCS-2 編碼:UCS-2 是固定長(zhǎng)度為16 位的unicode字符集。每個(gè)字符都是2 個(gè)字節(jié),UCS-2只支持unicode3.0,所以不支持附加字符。UCS-2 的優(yōu)點(diǎn):對(duì)于亞洲字符的存儲(chǔ)空間需求比UTF-8 少,因?yàn)槊總€(gè)字符都是2 個(gè)字節(jié)。處理字符的速度比UTF-8 更快,因?yàn)槭枪潭ㄩL(zhǎng)度編碼的。對(duì)于windows和 java的支持更好。UTF-16 編碼:UTF-16 也是一種16 位編碼的字符集。實(shí)際上,U

17、TF-16 就是UCS-2 加上附加字符的支持,也就是符合unicode4.0規(guī)范的UCS-2 。所以UTF-16 是 UCS-2 的嚴(yán)格超集。UTF-16 中的字符,要么是2 個(gè)字節(jié),要么是4 個(gè)字節(jié)表示的。UTF-16 主要在windows2000以上版本使用。UTF-16 相對(duì)UTF-8 的優(yōu)點(diǎn),和UCS-2 是一致的??偨Y(jié): 在亞洲進(jìn)行在web 開發(fā)時(shí),面向的是全球,使用UTF-8 編碼是絕對(duì)沒有錯(cuò)的,面向亞洲的話,使用 UCS-2 和 UTF 編碼效率會(huì)更高。 綜上所述,使用 UTF-8 編碼絕對(duì)沒有錯(cuò),不會(huì)出現(xiàn)編碼亂碼的現(xiàn)象。25.Sql Sever中 char 、 varchar

18、、 nchar和 nvarchar的對(duì)比區(qū)別!答: ncahr和 nvarchar采用unicode編碼,固定每個(gè)字符占用兩個(gè)字節(jié),char和 varchar固定每個(gè)字符采用一個(gè)字節(jié)。所以一般來說,如果含有中文字符,用nchar/nvarchar,如果純英文和數(shù)字,用 char/varchar我把他們的區(qū)別概括成:CHAR , NCHAR 定長(zhǎng),速度快,占空間大,需處理VARCHA ,R NVARCHA ,RTEXT 不定長(zhǎng),空間小,速度慢,無需處理。注意: 操作系統(tǒng)的語言環(huán)境支持中文可以使用char和 varchar,如果操作系統(tǒng)環(huán)境不支持中文,必須使用nvarchar和 ncahr 。請(qǐng)協(xié)

19、調(diào)好存儲(chǔ)代價(jià)和兼容性之間的關(guān)系。26.MD5 利用 salt進(jìn)行加密的過程程?用戶輸入【賬號(hào)】和【密碼】(以及其他用戶信息);系統(tǒng)為用戶生成【Salt 值】;系統(tǒng)將【 Salt 值】和【用戶密碼】連接到一起;對(duì)連接后的值進(jìn)行散列,得到【Hash 值】;將【 Hash 值 1】和【 Salt 值】分別放到數(shù)據(jù)庫中。用戶登錄時(shí),用戶輸入【賬號(hào)】和【密碼】;系統(tǒng)通過用戶名找到與之對(duì)應(yīng)的【Hash 值】和【Salt 值】;系統(tǒng)將【 Salt 值】和【用戶輸入的密碼】連接到一起;對(duì)連接后的值進(jìn)行散列,得到【Hash 值 2】(注意是即時(shí)運(yùn)算出來的值);比較【 Hash 值 1】和【 Hash 值 2】是

20、否相等,相等則表示密碼正確,否則表示密碼錯(cuò)誤。有時(shí)候,為了減輕開發(fā)壓力,程序員會(huì)統(tǒng)一使用一個(gè)salt 值(儲(chǔ)存在某個(gè)地方),而不是每個(gè)用戶都生成私有的salt 值。27.MD5 簡(jiǎn)介!答: Message DigestAlgorithmMD5 (中文名為消息摘要算法第五版)為計(jì)算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù), 用以提供消息的完整性保護(hù)。 用于確保信息傳輸完整一致。機(jī)廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法) ,主流編程語言普遍已有是計(jì)算MD5 實(shí)現(xiàn)算法原理:對(duì)為個(gè)MD5 算法簡(jiǎn)要的敘述可以為:MD5 以 512 位分組來處理輸入的信息,且每一分組又被劃分16 個(gè) 32 位子分組,經(jīng)過

21、了一系列的處理后,算法的輸出由四個(gè)32 位分組組成,將這四32 位分組級(jí)聯(lián)后單目運(yùn)算符28.C 語言中運(yùn)算符的優(yōu)先級(jí)別!30. alloca ,malloc、calloc和realloc的理解!答: alloca() 是分配在棧上,calloc()”是”分配內(nèi)存給多個(gè)對(duì)象”,”配內(nèi)存給一個(gè)對(duì)象”,”realloc()”是” 重新分配內(nèi)存 ”之意?!?free()malloc() ”是 ”分”就比較簡(jiǎn)單了, ”釋放 ”的意思,就是把之前所分配的內(nèi)存空間給釋放出來。參數(shù)均為以字節(jié)為單位。注意: alloca 不具可移植性,而且在沒有傳統(tǒng)堆棧的機(jī)器上很難實(shí)現(xiàn)。當(dāng)它的返回值直接傳入另一個(gè)函數(shù)時(shí)會(huì)帶來問

22、題,因?yàn)樗峙湓跅I稀?1.strstr(char *str1, char *str2)和 strchr(const char *s,char c)答:是分別求字符串和字符在前面字符串中第一次出現(xiàn)的地址的指針,返回的地址是字符串在內(nèi)存中隨機(jī)分配的地址再加上你所搜索的字符在字符串位置,的分別和用法!指針的內(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不需要指定長(zhǎng)度,它遇到被復(fù)制字符的串

23、結(jié)束符所以容易溢出。memcpy 則是根據(jù)其第3 個(gè)參數(shù)決定復(fù)制的長(zhǎng)度。"0"才結(jié)束,3、用途不同。 通常在復(fù)制字符串時(shí)用strcpy,而需要復(fù)制其他類型數(shù)據(jù)時(shí)則一般用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ù)指針作為返回值一個(gè)函數(shù)的返回值可以是一個(gè)函數(shù)指針,這個(gè)聲明形式寫起來有點(diǎn)麻煩:/ 函數(shù)指針作為返回值int(*retFunPointer(int)(constint&,constint&);上面的聲明的含義:a)retFunPointer是一個(gè)函數(shù),該函數(shù)有一個(gè)int類型的參數(shù);b)retFunPointer返回值是一個(gè)函數(shù)指針,它指向的是帶有兩個(gè)const int&類型參數(shù),且返回類型為int的函數(shù)。retFunPointer的定義:/函數(shù)指針為返

26、回值,整個(gè)函數(shù)名為retFunPointer,把自己裝扮成函數(shù)指針,作為返回值。int(*retFunPointer(intaInt)(constint&,constint&)cout << aInt << endl;/ pf已經(jīng)在前面定義過了returnpf;調(diào)用代碼示例:/函數(shù)指針作為返回值,retFunPointer返回一個(gè)cmpFun 類型的函數(shù)指針cmpFun pf3 = retFunPointer(aaInt);intresult = pf3(aaInt, bbInt);cout << result << endl;3

27、4. 注意:答: C語言中,頭文件中include的頭文件內(nèi)申明的函數(shù),在當(dāng)前.c文件中,是可以間接調(diào)用的!35. 注意答: C 語言中沒有bool類型,用0 和 1 來表示真假!C 語言和 C+ 都是強(qiáng)類型的,變量在申明時(shí)候就要指定類型,而不是等編譯器根據(jù)編譯時(shí)候所賦的值來確定其便編譯時(shí)的類型。36.MD5 算法原理簡(jiǎn)介!答:對(duì)MD5 算法簡(jiǎn)要的敘述可以為:MD5 以 512 位分組來處理輸入的信息,且每一分組又被劃分為16 個(gè) 32 位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32 位分組組成,將這四個(gè)32 位分組級(jí)聯(lián)后將生成一個(gè)128 位散列值。也就是32 個(gè)十六進(jìn)制的字符,每個(gè)字符

28、占 4 位從0 到 f ,均為小寫,因此叫做128 位散列值。37. strncmp()函數(shù)簡(jiǎn)介答:用 法 : int strncmp(char *str1, char *str2, int maxlen);說明 : 此函數(shù)功能即比較字符串 str1 和 str2 的前 maxlen 個(gè)字符。如果前maxlen字節(jié) 完全相等, 返回值就 =0;在前 maxlen 字節(jié)比較過程中,如果出現(xiàn) str1n與 str2n不等, 則返回( str1n-str2n) 1。38.<< 和 >> 和 >>> 這三個(gè)運(yùn)算符號(hào)的理解答:<<( 左移 )運(yùn)算規(guī)則

29、:按二進(jìn)制形式把所有的數(shù)字向左移動(dòng)對(duì)應(yīng)的位數(shù),高位移出( 舍棄)數(shù)學(xué)意義:在數(shù)字沒有溢出的前提下,對(duì)于正數(shù) 和 負(fù)數(shù) ,左移一位都相當(dāng)于乘以位就相當(dāng)于乘以2 的 n 次方。,低位的空位補(bǔ)零。2 的1 次方,左移n>>( 帶符號(hào)右移)運(yùn)算規(guī)則:按二進(jìn)制形式把所有的數(shù)字向右移動(dòng)對(duì)應(yīng)的位數(shù),低位移出( 舍棄 ) ,高位的空位補(bǔ)符號(hào)位,即正數(shù)補(bǔ)零,負(fù)數(shù)補(bǔ)1。數(shù)學(xué)意義:右移一位相當(dāng)于除2,右移n 位相當(dāng)于除以2 的 n 次方。這里是取商哈,余數(shù) 就不要了。>>>( 無符號(hào)右移)運(yùn)算規(guī)則:按二進(jìn)制形式把所有的數(shù)字向右移動(dòng)對(duì)應(yīng)位數(shù),低位移出( 舍棄 ) ,高位的空位補(bǔ)零。對(duì)于正

30、數(shù)來說和帶符號(hào)右移相同,對(duì)于負(fù)數(shù)來說不同。其他結(jié)構(gòu)和>>相似。39.getch()函數(shù)和getchar()函數(shù)的區(qū)別答: getch():所在頭文件:conio.h函數(shù)用途:從控制臺(tái)讀取一個(gè)字符,但不顯示在屏幕上, 然后程序繼續(xù)執(zhí)行下去。getchar()函數(shù):所在頭文件時(shí)stdio.h函數(shù)用途: 用戶按下字符后,等待用戶按下回車,然后繼續(xù)執(zhí)行,且返回值顯示在屏幕上。40. 注意strlen()函數(shù)求字符串長(zhǎng)度的時(shí)候不會(huì)講結(jié)尾符號(hào)0 算進(jìn)去。substr() 函數(shù)是 C+ 中的函數(shù), C 語言中沒有這個(gè)函數(shù),要想實(shí)現(xiàn)這個(gè)功能,可以使用 strncpy() 或者 memcpy 來實(shí)現(xiàn)

31、。41.strncpy()和 memcpy() 的區(qū)別答:二者都可指定長(zhǎng)度來實(shí)現(xiàn)串的拷貝。不同點(diǎn)是當(dāng)然有區(qū)別,strncpy()時(shí)拷貝字符串,memcpy() 是拷貝內(nèi)存內(nèi)容,可以拷貝其他類型的數(shù)據(jù)。42.sizeof()函數(shù)答: sizeof是運(yùn)算符,可用于任何變量名、類型名或常量值,當(dāng)用于變量名(不是數(shù)組名)或常量時(shí),它不需要用圓括號(hào)。它在編譯時(shí)起作用,而不是運(yùn)行時(shí)。sizeof的結(jié)果等于對(duì)象或者類型所占的內(nèi)存字節(jié)數(shù), 包括字符串的結(jié)尾符0,strlen()求字符串的長(zhǎng)度不包括結(jié)尾符0 。43.memet()函數(shù),解決內(nèi)存內(nèi)存空間出現(xiàn)屯屯屯屯屯屯和燙燙燙燙燙燙亂碼答: void *mems

32、et(void *s, char ch,size_tn);將 s 所指向的某一塊內(nèi)存中的每個(gè)字節(jié) 的內(nèi)容全部設(shè)置為ch 指定的ASCII 值, 塊的大小由第三個(gè)參數(shù)指定,這個(gè)函數(shù)通常為新申請(qǐng)的內(nèi)存做初始化工作,其返回值為指向S 的指針。其中 void*s 空指針,指針不指向任何地址空間。初始化內(nèi)存地址空間后就會(huì)解決亂碼問題,用 memset(s,NULL,sizeof(s).亂碼問題是因?yàn)槭褂胢alloc()申請(qǐng)的內(nèi)存空間沒有初始化,默認(rèn)賦值0xcc ,打印出來就是屯屯屯,malloc申請(qǐng)的空間是在" 堆 " 上的,可手動(dòng)釋放。使用 alloca()申請(qǐng)內(nèi)存會(huì)產(chǎn)生燙燙燙燙燙

33、燙,與malloc,calloc,realloc類似,但是注意一個(gè)重要的區(qū)別,_alloca是在棧 (stack)上申請(qǐng)空間, 用完馬上就釋放,無需手動(dòng)釋放。44. c語言中定義變量不賦初值默認(rèn)是多少?答: C 語言中 , 沒有加 static 默認(rèn)為 auto 果加了 static, 不給初值的變量的初值是默認(rèn)是只是它不代表任何地址。型此時(shí)不給初值的變量的初值是隨機(jī)的0,指針也是一樣,其實(shí)NULL, 但是的值就是如0 ,45.C 語言從源碼到可執(zhí)行程序的四個(gè)過程答:預(yù)處理 ( 也稱預(yù)編譯, Preprocessing):C 語言的預(yù)處理主要有三個(gè)方面的內(nèi)容:1.宏定義;2. 文件包含;3.條

34、件編譯。預(yù)處理命令以符號(hào) “ #”開頭,這個(gè)方面本質(zhì)是將需要的代碼包含到當(dāng)前的.c文件中。編譯 (Compilation):編譯所做的工作就是詞法分析,語法分析,在進(jìn)行匯編成中間代碼,匯編代碼。匯編 (Assembly):匯編實(shí)際上指把匯編語言代碼翻譯成目標(biāo)機(jī)器指令的過程。經(jīng)過這一處理而得到相應(yīng)的目標(biāo)文件。目標(biāo)文件中所存放的也就是與源程序等效的目標(biāo)的機(jī)器語言代碼。目標(biāo)文件由段組成。通常一個(gè)目標(biāo)文件中至少有兩個(gè)段:代碼段:該段中所包含的主要是程序的指令。該段一般是可讀和可執(zhí)行的,但一般卻不可寫。數(shù)據(jù)段:主要存放程序中要用到的各種全局變量或靜態(tài)的數(shù)據(jù)。一般數(shù)據(jù)段都是可讀,可寫,可執(zhí)行的。鏈接 (L

35、inking):鏈接程序的主要工作就是將有關(guān)的目標(biāo)文件彼此相連接,也即將在一個(gè)文件中引用的符號(hào)同該符號(hào)在另外一個(gè)文件中的定義連接起來,使得所有的這些目標(biāo)文件成為一個(gè)能夠誒操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。鏈接過程分為靜態(tài)鏈接和動(dòng)態(tài)鏈接。靜態(tài)鏈接是指連接程序從靜態(tài)鏈接庫中拷貝需要的代碼到被執(zhí)行的程序中,動(dòng)態(tài)鏈接是指代碼被放到稱作是動(dòng)態(tài)鏈接庫或共享對(duì)象的某個(gè)目標(biāo)文件中,鏈接程序此時(shí)所作的只是在最終的可執(zhí)行程序中記錄下共享對(duì)象的名字以及其它少量的登記信息。 在此可執(zhí)行文件被執(zhí)行時(shí),動(dòng)態(tài)鏈接庫的全部?jī)?nèi)容將被映射到運(yùn)行時(shí)相應(yīng)進(jìn)程的虛地址空間。動(dòng)態(tài)鏈接程序?qū)⒏鶕?jù)可執(zhí)行程序中記錄的信息找到相應(yīng)的函數(shù)代碼。46.G

36、CC 編譯器編譯的過程答:實(shí)質(zhì)上, GCC 的編譯過程是分為四個(gè)階段進(jìn)行的,即預(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,編譯成目標(biāo)文件test.o。連接 (Linking

37、): gcc test.o -o test.out47. C 語言程序調(diào)試的常見錯(cuò)誤分析與解決辦法答: C 語言程序的編譯是以.c 文件為單位進(jìn)行編譯的,生成.obj二進(jìn)制目標(biāo)文件,最后在鏈接成可執(zhí)行文件。編譯提示的錯(cuò)誤:編譯的時(shí)候進(jìn)行詞法分析和語法分析,此時(shí)書寫不符合語法規(guī)則或者未定義會(huì)進(jìn)行報(bào)錯(cuò),這種錯(cuò)誤容易處理。鏈接提示的錯(cuò)誤: 經(jīng)常會(huì)出現(xiàn)某函數(shù)已經(jīng)在 main.obj 預(yù)處理的條件編譯就發(fā)揮作用了, 可以防止重復(fù)編譯。文件中定義,出現(xiàn)重復(fù)編譯。這時(shí)候但是, 作用只能是防止變量的申明的重復(fù)編譯,而不能防止變量的定義的重復(fù)編譯。也就是說,在頭文件中定義了函數(shù)之后,在不同的 .c 文件引入頭文

38、件中,兩個(gè).c文件生成的obj文件中都會(huì)含有對(duì)函數(shù)體代碼的目標(biāo)代碼。原因是, 我個(gè)人理解是, 條件編譯之所以對(duì)頭文件中定義的函數(shù)不能起到防止重復(fù)編譯的功能,是因?yàn)楹瘮?shù)體的實(shí)現(xiàn)代碼編譯后最終是要存入obj目標(biāo)文件中的,編譯是以 .c文件為單位的,每個(gè).c 文件都會(huì)被編譯成.obj文件,但是 .h文件中不能編譯成obj文件,因此其函數(shù)的定義部分,即實(shí)現(xiàn)部分一定要編譯成目標(biāo)代碼存入 obj文件,供鏈接時(shí)使用。但是當(dāng)兩個(gè) .c 文件同時(shí)引用頭文件時(shí),兩個(gè).c 文件都可包含函數(shù)實(shí)現(xiàn)部分的代碼的目標(biāo)代碼,編譯器沒有規(guī)定將函數(shù)代碼的目標(biāo)代碼存入哪個(gè).c 文件,只能兩個(gè)同時(shí)包含,這就導(dǎo)致了鏈接時(shí)出現(xiàn)的重復(fù)定義

39、的問題。解決的辦法就是不要在頭文件中定義變量,只能申明?;蛘咧荒茏屢粋€(gè) .c 文件引用含有定義變量的頭文件,或者用static來修飾函數(shù),定義為全局靜態(tài)類型函數(shù),這樣的話函數(shù)代碼就會(huì)被存到全局/ 靜態(tài)存儲(chǔ)區(qū),編譯時(shí)只會(huì)被編譯一次,若非 static靜態(tài)全局變量,函數(shù)被包含進(jìn).c文件后,就變成了當(dāng)前.c 文件的全局變量,而不是整個(gè)程序的全局變量,這就導(dǎo)致了每個(gè).c文件把它當(dāng)做自己的函數(shù)來進(jìn)行編譯,將目標(biāo)代碼存入自己的obj 文件中,鏈接時(shí)就會(huì)出錯(cuò)。48.C/C+ 語言中程序在內(nèi)存中的分區(qū)情況答:在 C+ 中,內(nèi)存分成 5 個(gè)區(qū),他們分別是堆、棧、自由存儲(chǔ)區(qū)、全局 / 靜態(tài)存儲(chǔ)區(qū)和常量存儲(chǔ)區(qū)。棧區(qū)

40、 ,就是那些由編譯器在需要的時(shí)候分配,在不需要的時(shí)候自動(dòng)清除的變量的存儲(chǔ)區(qū)。里面的變量通常是局部變量、函數(shù)參數(shù)等。堆區(qū) ,就是那些由 new 分配的內(nèi)存塊,他們的釋放編譯器不去管,由我們的應(yīng)用程序去控制,一般一個(gè) new 就要對(duì)應(yīng)一個(gè) delete 。如果程序員沒有釋放掉,那么在程序結(jié)束后,操作系統(tǒng)會(huì)自動(dòng)回收。程序代碼區(qū) 存放函數(shù)體的二進(jìn)制代碼。全局 / 靜態(tài)存儲(chǔ)區(qū),全局變量和靜態(tài)變量被分配到同一塊內(nèi)存中,在以前的C 語言中,全局變量又分為初始化的和未初始化的,在C+ 里面沒有這個(gè)區(qū)分了,他們共同占用同一塊內(nèi)存區(qū)。常量存儲(chǔ)區(qū),這是一塊比較特殊的存儲(chǔ)區(qū),他們里面存放的是常量,不允許修改50.C

41、語言中sizeof()不能用來求指針指向的內(nèi)存空間的大小答: *output=(char*)alloca(23*sizeof( char );sizeof(output);求得的不是指針output指向的內(nèi)存的地址空間的大小,而是指針變量本身所占的內(nèi)存空間大小,為 4 個(gè)字節(jié)。指針和數(shù)組是不一樣的,但數(shù)組做為參數(shù)傳遞時(shí)就會(huì)退化為同類型的指針. str是數(shù)組擁有固定的內(nèi)存sizeof是計(jì)算它占的字節(jié)數(shù), 而指針只是一個(gè)存放變量地址的一個(gè)變量在任何時(shí)候都是占四個(gè)字節(jié).51.C語言中不能用用strlen(),來求指針指向內(nèi)存空間的長(zhǎng)度,初始化后的指針字符串才可以答 : 因?yàn)閟trlen()函數(shù)是用來

42、計(jì)算字符串的長(zhǎng)度,是以NULL 來表示的字符串結(jié)尾的標(biāo)志,如果沒有0 這個(gè)字符的話,strlen()統(tǒng)計(jì)出來的長(zhǎng)度是不正確的。52. C 語言中函數(shù)的變參問題答: C 語言中輸入和輸出格式控制函數(shù)的參數(shù)實(shí)現(xiàn)不定的變化,是在C 語言中解決變參問題的一組宏,所在頭文件:其實(shí)現(xiàn)的機(jī)理是因?yàn)閂A_LIST#include <stdarg.h>。具體請(qǐng)參見百,度百科。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 )寄存器。當(dāng)進(jìn)行讀 / 寫存儲(chǔ)器操作數(shù)或者訪問變量時(shí),自動(dòng)選擇DS 或者 ES 寄存器作為段基址。DS 偏移地址對(duì)應(yīng)SI( Source Index源變址寄存器)、 DI( Destination Index目的變址寄存器)CS 偏移地址對(duì)應(yīng)IP(指針寄存器 )SS 偏移地址對(duì)應(yīng)B(P基址指針寄存器Base Pointer)或 S(P 堆棧指針寄存器Stack Pointer )ES 偏移地址對(duì)應(yīng)DI( Destination Index目的變址寄存器)53.C 語言中地址尋址與處理器的關(guān)系答: 8080 的地址線是16條, 8086/8088 的地址線有20 條, 80286 的地址

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論