標(biāo)準(zhǔn)C語言問答題_第1頁
標(biāo)準(zhǔn)C語言問答題_第2頁
標(biāo)準(zhǔn)C語言問答題_第3頁
標(biāo)準(zhǔn)C語言問答題_第4頁
標(biāo)準(zhǔn)C語言問答題_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、標(biāo)準(zhǔn)C語言問答題注:以下問題請根據(jù)聯(lián)機(jī)文檔和課程視頻的講解獨(dú)立完成,要求本文檔在全部完成后提交,由輔導(dǎo)教師進(jìn)行批改?;卮饐栴}時(shí)請將答案填寫在藍(lán)色答:之后。注冊名: 1.1.1 C語言概述 (ch1)1) C語言起源于那一年,C語言的發(fā)明者是誰?答:2) 詳細(xì)描述C語言的優(yōu)勢。答:3) 簡述C語言的未來發(fā)展方向。答:4) 簡述C語言的不足。答:5) 簡述C語言的兩個(gè)標(biāo)準(zhǔn)。答:1.1.2 數(shù)據(jù) (ch2)1) C語言中,基本數(shù)據(jù)類型有幾個(gè),請分別加以描述。答:2) 字符類型也屬于C語言整型家族,并且分為有符號(singed)和無符號(unsigned)兩種版本。這個(gè)判斷對嗎?答:3) C語言有布爾

2、類型嗎?請加以說明。答:4) 簡述整型的長度和機(jī)器字長的關(guān)系。答:5) 長整型至少應(yīng)該和整型一樣長,而整型至少應(yīng)該和短整型一樣長。這句話對嗎?答:6) 整數(shù)用八進(jìn)制來表示和用十六進(jìn)制來表示時(shí),開頭的標(biāo)識是什么?答:7) value = value 48; value = value 60; value = value - 0; 這三條語句相等嗎?答:8) 枚舉類型的變量實(shí)際上以整型的方式存儲,例如:enum Jar_TypeCUP = 8, PINT = 16, QUART, HALF_GALLON, GALLON=128; 這種只對部分符號名賦值合法嗎?答:9) 在上面定義的枚舉類型變量Ja

3、r_Type中,QUART, HALF_GALLON 的值分別是多少?答:10) 浮點(diǎn)數(shù)家族包括哪幾種類型?答:11) 標(biāo)準(zhǔn)中針對浮點(diǎn)數(shù)定義的FLT_MAX, DBL_MAX和LDBL_MAX這三個(gè)常量,具體含義是什么,是在那個(gè)系統(tǒng)頭文件中定義的。答:12) C語言中的字符串,通常存儲在字符數(shù)組中,它的結(jié)束標(biāo)志是什么?請描述該結(jié)束標(biāo)志的具體含義。答:13) 字符串常量中, 字符串的含義是什么?答:14) 當(dāng)一個(gè)字符串常量出現(xiàn)于一個(gè)表達(dá)式中時(shí),如:printf(%sn, Original input.); 表達(dá)式所使用的值就是這些字符所存儲的地址,而不是這些字符本身。這句話對嗎?答:15) C語

4、言中,數(shù)組的下標(biāo)總是從0開始,還是從1開始?答:16) C編譯器一般并不檢查程序?qū)?shù)組下標(biāo)的引用是否在數(shù)組的合法范圍內(nèi),所以防止因數(shù)組越界而產(chǎn)生的非法訪問都是程序員自己的事。判斷這句話的正確性,請給出一個(gè)例子程序加以驗(yàn)證。答:17) C語言支持一種叫作typedef的機(jī)制,它允許你為各種數(shù)據(jù)類型定義新名字:char *ptr_to_char; typedef char *ptr_to_char; ptr_to_char a; 請給出這三個(gè)聲明的解釋。答:18) const變量的賦值方法:首先,可以在聲明時(shí)對它進(jìn)行初始化,如int const a = 15; 其次,在函數(shù)中聲明為const的形參

5、在函數(shù)被調(diào)用時(shí)會得到實(shí)參的值。請問,還有其它方式或場合可以對一個(gè)const變量進(jìn)行賦初值嗎?答:19) 以下指針變量的const屬性:int const *pci; int *const cpi; int const *const cpci; 請?jiān)敿?xì)描述三者的區(qū)別。答:20) #define指令是另一種創(chuàng)建名字常量的機(jī)制, #define MAX_ELEMENTS 50 (注意:#define語句之后沒有”;”),int const max_elements = 50; 請給出二者在存儲概念上的區(qū)別。答:21) 標(biāo)識符的作用域就是程序中該標(biāo)識符可以被使用的區(qū)域,C編譯器可以確認(rèn)4種不同類型的作

6、用域 - 文件作用域、函數(shù)作用域、代碼塊作用域和原型作用域。請分別給出示例對這四種標(biāo)識符的作用域加以描述。答:22) 位于一對花括號之間的所有語句稱為一個(gè)代碼塊。任何在代碼塊的開始位置聲明的標(biāo)識符都具有代碼塊作用域(block scope), 表示它們可以被這個(gè)代碼塊中的所有語句訪問。請判斷上述描述的正確性。答:23) 任何在所有代碼塊之外聲明的標(biāo)識符都具有文件作用域(file scope), 它表示這些標(biāo)識符從它們的聲明之處直到它所在的源文件結(jié)尾處都是可以訪問的。請判斷上述描述的正確性。答:24) 鏈接屬性一共有3種 - external(外部)、internal(內(nèi)部)和none(無)。請

7、分別對這三種鏈接屬性用示例加以說明。答:25) 關(guān)鍵字extern和static用于在聲明中修改標(biāo)識符的鏈接屬性,如果某個(gè)聲明在正常情況下具有external鏈接屬性,在它前面加上static關(guān)鍵字可以使它的鏈接屬性變?yōu)閕nternal. static只對缺省鏈接屬性為external的聲明才有改變鏈接屬性的效果。請判斷上述描述的正確性,并用示例加以說明。答:26) 變量的存儲類型(storage class)是指存儲變量值的內(nèi)存類型。有三個(gè)地方可以用于存儲變量,請給出這三個(gè)地方的具體名稱。答:27) 凡是在任何代碼塊之外聲明的變量總是存儲于靜態(tài)內(nèi)存中,也就是屬于堆棧的內(nèi)存,這類變量稱為靜態(tài)(

8、static)變量。這句話對嗎?答:28) 靜態(tài)變量在程序運(yùn)行之前創(chuàng)建,在程序的整個(gè)執(zhí)行期間始終存在。這句話對嗎?答:29) 在代碼塊內(nèi)部聲明的變量的缺省存儲類型是自動的(automatic). 也就說它存儲于堆棧中,稱為自動(auto)變量。在程序執(zhí)行到聲明自動變量的代碼塊時(shí),自動變量才被創(chuàng)建,當(dāng)程序的執(zhí)行流程離開該代碼塊時(shí),這些自動變量便自動銷毀。如果該代碼塊被數(shù)次執(zhí)行,例如一個(gè)函數(shù)被反復(fù)調(diào)用,這些自動變量每次將重新創(chuàng)建。請舉例說明自動變量的生存周期。答:30) 對于在代碼塊內(nèi)部聲明的變量,如果給它加上關(guān)鍵字static, 可以使它的存儲類型從自動變?yōu)殪o態(tài)。這句話對嗎?答:31) 函數(shù)的形

9、式參數(shù)可以聲明為靜態(tài)嗎?請說明理由。答:32) 關(guān)鍵字register可以用于自動變量和靜態(tài)變量的聲明,提示它們應(yīng)該存儲于機(jī)器的硬件寄存器而不是內(nèi)存中,這類變量稱為寄存器變量。這個(gè)論述有什么問題,請給出你的觀點(diǎn)。答:33) 當(dāng)用于函數(shù)定義、或用于代碼塊之外的變量聲明時(shí),static關(guān)鍵字用于修改標(biāo)識符的鏈接屬性,即從external改為internal, 但標(biāo)識符的存儲類型和作用域不受影響。這種方式聲明的函數(shù)或變量只能在聲明它們的源文件中訪問。該論述正確嗎?答:34) 當(dāng)用于代碼塊內(nèi)部的變量聲明時(shí),static關(guān)鍵字用于修改變量存儲類型,從自動變量修改為靜態(tài)變量,但靜態(tài)的鏈接屬性和作用域不受影

10、響。用這種方式聲明的變量在程序執(zhí)行之前創(chuàng)建,并在程序的整個(gè)執(zhí)行期間一直存在,而不是每次在代碼塊開始執(zhí)行時(shí)創(chuàng)建,在代碼塊執(zhí)行完畢后銷毀。該論述正確嗎?答:1.1.3 語句 (ch3)1) ANSI C并不具備布爾類型(C99標(biāo)準(zhǔn)雖然添加了_Bool布爾類型,但目前多數(shù)編譯器并不支持),那它是使用什么類型來替代的?答:2) 在while循環(huán)中如果使用break語句,那么執(zhí)行流下一條應(yīng)該執(zhí)行那條語句。答:3) 在while循環(huán)中也可以使用continue語句,它用于終止當(dāng)前的那次循環(huán)。在執(zhí)行完continue語句之后,執(zhí)行流接下來應(yīng)當(dāng)做什么?答:4) for語句由初始化部分(只在循環(huán)開始時(shí)執(zhí)行一次)

11、、條件部分(在循環(huán)體每次執(zhí)行前都要執(zhí)行一次)、調(diào)整部分(它在循環(huán)體每次執(zhí)行完畢,在條件部分即將執(zhí)行之前執(zhí)行)。所有三部分表達(dá)式都是可選的,都可以省略,這樣做可以嗎?答:5) do語句相對于while和for語句的主要不同點(diǎn)在哪?答:6) 對于switch語句,switch(expression), 其中expression的結(jié)果必須是什么類型?答:7) 在每個(gè)switch語句中都放上一條default子句是個(gè)好習(xí)慣,這樣做的理由是什么?答:8) 在一般情況下,我們應(yīng)該盡量避免goto語句。但對于跳出多層嵌套循環(huán)的情況下,由于break語句只影響包圍它的最內(nèi)層循環(huán),要想立即從深層嵌套的循環(huán)中退出

12、只有一個(gè)辦法,就是使用goto語句。談?wù)勀銓@句話的理解。答:9) C并不具備任何輸入/輸出語句:I/O是通過調(diào)用系統(tǒng)函數(shù)實(shí)現(xiàn)的。C也不具備任何異常處理語句,它們也是通過調(diào)用庫函數(shù)來完成的。這個(gè)論斷正確嗎?答:1.1.4 操作符與表達(dá)式 (ch4)1) C提供了所有常用的算術(shù)操作符:+ - * / %, 這幾個(gè)操作符都是既適用于浮點(diǎn)類型又適用于整數(shù)類型。這個(gè)論斷正確嗎?答:2) 左移位操作符為 . 兩個(gè)操作數(shù)都必須是什么類型?答:3) C標(biāo)準(zhǔn)說明無符號值執(zhí)行的所有移位操作都是邏輯位移,但對于有符號值,到底是采用邏輯位移還是算術(shù)位移取決于編譯器。請說出邏輯位移和算術(shù)位移的區(qū)別。答:4) 語句 v

13、alue = value | 1 bit_number; 實(shí)現(xiàn)怎樣的功能。答:5) 語句 value = value & (1 bit_number); 實(shí)現(xiàn)怎樣的功能。答:6) value & 1 = = != = , 它們結(jié)果是整型值嗎?答:11) 條件操作符:expression1 ? expression2 : expression3; 首先計(jì)算的是expression1, 如果它的值為真(非零值),那么整個(gè)表達(dá)式的值就是expression2的值,expression3不會進(jìn)行求值。如果expression1的值是假(零值),那么整個(gè)條件語句的值就是expression3的值,此時(shí)e

14、xpression2會進(jìn)行求值嗎?答:12) 請談?wù)勛笾?L-value)和右值(R-value)之間的區(qū)別。答:1.1.5 指針 (ch5)1) 通過一個(gè)指針訪問它所指向的地址的過程稱為間接訪問(indirection)或解引用指針(dereferencing the pointer). 這個(gè)用于執(zhí)行間接訪問的操作符是單目操作符 * . 可以對一個(gè)NULL指針進(jìn)行解引用操作嗎?答:2) 對于 int *a; *a = 12; 這是一個(gè)極為常見的錯誤,請解釋出錯的原因。答:3) 標(biāo)準(zhǔn)定義了NULL指針,請談?wù)勀銓ULL指針的認(rèn)識?答:4) int a; *&a = 25; 請解釋該語句的含義

15、?答:5) int a = 12; int *b = &a; int *c = &b; 這三條語句有沒有問題,談?wù)効捶?。答?) 結(jié)合標(biāo)準(zhǔn)C語言教程 5.11 指針表達(dá)式 的內(nèi)容,重點(diǎn)理解清楚:&cp; *cp; *cp + 1; *(cp + 1); +cp; cp+; *+cp; *cp+; +*cp; (*cp)+; +*+cp; +*cp+; 的具體含義,并給出相應(yīng)的解釋。答:7) 結(jié)合標(biāo)準(zhǔn)C語言教程的 Code 5-3 在一組字符串中查找:版本2 中的代碼,解釋 *(*strings)+; 語句的具體含義。答:1.1.6 函數(shù) (ch6)1) 函數(shù)的定義與函數(shù)聲明的區(qū)別是什么?答:2

16、) C函數(shù)的所有參數(shù)均以傳值調(diào)用方式進(jìn)行傳遞,這樣,函數(shù)體修改這個(gè)參數(shù)值時(shí),會修改調(diào)用程序?qū)嶋H傳遞給它的變量值嗎?答:3) 如果C函數(shù)被傳遞的參數(shù)是一個(gè)數(shù)組名,并且在函數(shù)中使用下標(biāo)來引用該數(shù)組參數(shù),那么在函數(shù)中對數(shù)組元素進(jìn)行修改實(shí)際上修改的是調(diào)用程序中的數(shù)組元素。函數(shù)將訪問調(diào)用程序的數(shù)組元素,數(shù)組并不會被復(fù)制。數(shù)組名的值實(shí)際上是一個(gè)指針,傳遞給函數(shù)的就是這個(gè)指針的一份拷貝。這段論述有沒有問題?答:4) 結(jié)合標(biāo)準(zhǔn)C語言教程中 Code 6-3a 整數(shù)交換:無效的版本 和 Code 6-3b 整數(shù)交換:有效版本,談?wù)勀銓χ祩鬟f和引用傳遞的理解,二者之間有什么區(qū)別?答:5) C通過運(yùn)行時(shí)堆棧支持遞歸

17、函數(shù)的實(shí)現(xiàn)。請講一下堆棧的原理和實(shí)際的用途。答:6) 追蹤一個(gè)遞歸函數(shù)執(zhí)行過程的關(guān)鍵是理解函數(shù)中所聲明的變量是如何存儲的。當(dāng)函數(shù)被調(diào)用時(shí),它的變量的空間是創(chuàng)建于運(yùn)行時(shí)堆棧上的。以前調(diào)用的函數(shù)的變量仍保留在堆棧上,但它們被新函數(shù)的變量所掩蓋,因此是不能被訪問的。你能否理解掩蓋一詞在這里的含義?答:1.1.7 數(shù)組 (ch7)1) 在C中,在幾乎所有使用數(shù)組名的表達(dá)式中,數(shù)組名的值是一個(gè)指針常量,這個(gè)指針指向的是什么位置?可以對這個(gè)指針直接進(jìn)行算術(shù)運(yùn)算嗎?答:2) 在兩種場合下,數(shù)組名并不用指針常量來表示-就是當(dāng)數(shù)組名作為sizeof操作符或單目操作符 & 的操作數(shù)時(shí)。sizeof返回整個(gè)數(shù)組的長

18、度,而不是指向數(shù)組的指針的長度。取一個(gè)數(shù)組名的地址所產(chǎn)生的是一個(gè)指向數(shù)組的指針,而不是指向某個(gè)指針常量值的指針。針對上述論斷,請編寫一個(gè)例子程序進(jìn)行驗(yàn)證。答:3) 能不能使用賦值符把一個(gè)數(shù)組的所有元素復(fù)制到另一個(gè)數(shù)組。談?wù)勀愕目捶ā4穑?) 下標(biāo)引用arraysubscript; 和間接訪問 *(array + (suybscripy); 二者在效果上有區(qū)別嗎?答:5) 聲明一個(gè)數(shù)組時(shí),編譯器將根據(jù)聲明所指定的元素?cái)?shù)量為數(shù)組保留內(nèi)存空間,然后再創(chuàng)建數(shù)組名,數(shù)組名是一個(gè)常量,指向這段空間的起始位置。請比較數(shù)組聲明和指針變量聲明的區(qū)別。答:6) 當(dāng)一個(gè)數(shù)組名作為參數(shù)傳遞給一個(gè)函數(shù)時(shí),傳遞給函數(shù)的是

19、參數(shù)的一份拷貝(指向數(shù)組起始位置的指針的拷貝),所以函數(shù)可以自由地操作它的指針形參,而不必?fù)?dān)心會修改對應(yīng)的作為實(shí)參的指針。這個(gè)論斷正確嗎?答:7) 函數(shù)原型中的一維數(shù)組形參無需寫明它的元素?cái)?shù)目,因?yàn)楹瘮?shù)并不為數(shù)組參數(shù)分配內(nèi)存空間。形參只是一個(gè)指針,它指向的是已經(jīng)在其它地方分配好內(nèi)存的空間。這個(gè)事實(shí)解釋了為什么數(shù)組形參可以與任何長度的數(shù)組匹配-它實(shí)際傳遞的只是指向數(shù)組第1個(gè)元素的指針。另一方面,這種實(shí)現(xiàn)方法使函數(shù)無法知道數(shù)組的長度。如果函數(shù)需要知道數(shù)組的長度,它必須作為一個(gè)顯式的參數(shù)傳遞給函數(shù)。你是如何理解以上論述的?答:8) 存儲于靜態(tài)內(nèi)存的數(shù)組只能初始化一次,也就是在程序開始執(zhí)行之前。如果數(shù)

20、組未被顯式初始化,數(shù)組元素的初始值將會自動設(shè)置為零。寫一個(gè)示例程序進(jìn)行驗(yàn)證。答:9) 請回答自動變量在缺省情況下可以有初始化的值嗎?答:10) 對于char message = hello; 和 char *message1 = hello; 請回答message和message1在存儲位置、訪問方式上有什么區(qū)別?答:11) 在C中,多維數(shù)組元素的存儲順序是按照什么原則進(jìn)行?答:12) 請給出以下代碼的輸出,假定matrix已按自然數(shù)初始化:int matrix610;int *mp;.mp = &matrix38;printf(First value is %dn, *mp);printf(

21、Second value is %dn, *+mp);printf(Third value is %dn, *+mp);答:13) 多維數(shù)組名的值實(shí)際上是另一個(gè)數(shù)組,例如:int matrix310; matrix這個(gè)名字的值是一個(gè)指向它第1個(gè)元素的指針,所以matrix是一個(gè)指向一個(gè)包含了3個(gè)整型元素的數(shù)組的指針。這個(gè)論斷有沒有問題?答:14) 對于int matrix310; 請分析后面兩個(gè)表達(dá)式 *(matrix + 1) + 5; 和 *(*( matrix + 1) + 5); 的具體含義。答:15) 指向整型數(shù)組的指針的定義: int (*p)10; p是一個(gè)指向擁有10個(gè)整型元素

22、的數(shù)組的指針。我們可以使用這個(gè)指針一行一行地在上述matrix中移動,請回答給p每次加1在內(nèi)存中要移動多少個(gè)字節(jié)數(shù)?答:16) 如果需要一個(gè)指針逐個(gè)訪問整型元素而不是逐行在二維數(shù)組中移動。下面兩個(gè)聲明都創(chuàng)建了一個(gè)簡單的整型指針,并以兩種不同的方式進(jìn)行初始化,指向matrix的第1個(gè)整型元素。int *pi = &matrix00; int *pi1 = matrix0; 請問pi 和pi1有區(qū)別嗎?答:17) 作為函數(shù)參數(shù)的多維數(shù)組名的傳遞方式和一維數(shù)組名相同-實(shí)際傳遞的是一個(gè)指向數(shù)組第1個(gè)元素的指針。談?wù)剝烧咴谧鳛楹瘮?shù)形參時(shí)存在的區(qū)別?答:18) 把二維數(shù)組作為函數(shù)形參進(jìn)行聲明時(shí),以下兩種方

23、式都是可以的, void func(int (*mat)10); void func(int mat10); 那么將func寫成void func2(int *mat); 這樣的原型正確嗎?請給出你的解釋。答:19) 在多維數(shù)組中,只有第1維才能根據(jù)初始化列表缺省地提供。剩余的幾個(gè)維必須顯式地寫出,這樣編譯器就能推斷出每個(gè)子數(shù)組維數(shù)的長度。對于這個(gè)論述,請解釋原因何在。答:20) 對于指針數(shù)組聲明:int *api10; 下標(biāo)引用和間接訪問的優(yōu)先級哪個(gè)更高,在這個(gè)表達(dá)式中,首先執(zhí)行的是下標(biāo)引用還是間接訪問?答:21) 對于二維數(shù)組的兩種定義方式:char const *keyword = do

24、,for,if,register,return,switch,while;char const keyword19 = do,for,if,register,return,switch,while;請編寫代碼比較keyword 和 keyword1 在內(nèi)存中所占空間的大小。答:22) 指針表達(dá)式可能比下標(biāo)表達(dá)式效率更高,但下標(biāo)表達(dá)式?jīng)Q不可能比指針表達(dá)式效率更高。談?wù)勀銓@句話的理解。答:1.1.8 字符串、字符和字節(jié) (ch8)1) 字符串就是一串零個(gè)或多個(gè)字節(jié),并且以一個(gè)位模式為全0的NUL字節(jié)結(jié)尾。因此,字符串所包含的字符內(nèi)部不能出現(xiàn)NUL字節(jié)。NUL字節(jié)是字符串的終止符,請問NUL本身是

25、不是字符串的一部分?字符串的長度是否包括NUL字節(jié)?答:2) 以下代碼段存在什么問題,請予以更正:char message = original message;char message1 = oh, oh;.strcpy(message, A different message);printf(%sn%sn, message, message1);答:3) 請談?wù)剆trcpy(), memcpy() 的區(qū)別。答:1.1.9 動態(tài)內(nèi)存分配 (ch10)1) void *malloc(size_t size);malloc的參數(shù)就是需要分配的內(nèi)存字節(jié)數(shù)。如果內(nèi)存池中的可用內(nèi)存可以滿足這個(gè)需求,m

26、alloc就返回一個(gè)指向被分配的內(nèi)存塊的起始位置的指針。請問malloc所分配的的內(nèi)存空間一定是連續(xù)的嗎?這個(gè)空間是在棧還是堆上分配的?答:2) 談?wù)剬膍alloc返回的指針進(jìn)行有效性檢查的必要性。答:3) free的參數(shù)必須要么是NULL, 要么是一個(gè)先前從malloc, calloc 和realloc返回的值。向free傳遞一個(gè)NULL參數(shù)會產(chǎn)生不良的效果嗎?答:4) malloc和calloc之間的主要區(qū)別是什么?答:5) 什么情況下會引起內(nèi)存泄漏(memory leak)?答:1.1.10 結(jié)構(gòu)和聯(lián)合 (ch9)1) 聚合數(shù)據(jù)類型(aggregate data type)能夠同時(shí)存儲

27、超過一個(gè)的單獨(dú)數(shù)據(jù)。C提供了兩種類型的聚合數(shù)據(jù)類型,數(shù)組和結(jié)構(gòu)。請談一下數(shù)組和結(jié)構(gòu)的區(qū)別?答:2) 關(guān)于結(jié)構(gòu)的自引用:struct SELF_REF1 int a; struct SELF_REF1 b; int c;以上這種類型的自引用是非法的,請說明原因,并給出正確的聲明方式。答:3) 自引用的聲明方式:typedef struct int a; SELF_REF3 *b; int c;SELF_REF3;typedef struct SELF_REF3_TAG int a; struct SELF_REF3_TAG *b; int c;SELF_REF3;以上兩個(gè)自引用的聲明方式那個(gè)正確

28、?答:4) 標(biāo)準(zhǔn)C語言教程中9.2 結(jié)構(gòu)、指針和成員 作為重點(diǎn)要求深入理解。談?wù)勀銓Y(jié)構(gòu)和指針重要性的認(rèn)識。答:5) 結(jié)構(gòu)的存儲分配和邊界對齊:系統(tǒng)禁止編譯器在一個(gè)結(jié)構(gòu)的起始位置跳過幾個(gè)字節(jié)來滿足邊界對齊要求,因此所有的結(jié)構(gòu)的起始存儲位置必須是結(jié)構(gòu)中邊界要求最嚴(yán)格的數(shù)據(jù)類型所要求的位置。根據(jù)以上原則,求結(jié)構(gòu)體ALIGN和ALIGN1的大?。簊truct ALIGN char a; int b; char c;struct ALIGN1 int b; char a; char c;答:6) offsetof(type, member)的用法:type就是結(jié)構(gòu)的類型,member就是需要的那個(gè)成員

29、名。表達(dá)式的結(jié)果是一個(gè)size_t值,表示這個(gè)指定成員開始存儲的位置距離結(jié)構(gòu)開始存儲的位置偏移幾個(gè)字節(jié)。例如,對前面ALIGN聲明而言,offset(struct ALIGN, b); 的返回值是4. 請?jiān)诰幾g器上進(jìn)行體驗(yàn)。答:7) 位段(bit field)的聲明和結(jié)構(gòu)類似,但它的成員是一個(gè)或多個(gè)位的字段。位段成員必須聲明為int、signed int或unsigned int 類型。下面是一個(gè)位段聲明的例子,請畫出變量ch1在內(nèi)存的具體存儲形式:struct CHAR unsigned ch : 7; unsigned font : 6; unsigned size : 19;struct

30、 CHAR ch1;答:8) 根據(jù)邊界對齊要求降序排列結(jié)構(gòu)成員可以最大限度地減少結(jié)構(gòu)存儲中浪費(fèi)的內(nèi)存空間。sizeof返回的值包含了結(jié)構(gòu)中浪費(fèi)的內(nèi)存空間嗎?答:9) 聯(lián)合的所有成員引用的是內(nèi)存中的相同位置。當(dāng)需要在不同的時(shí)刻把不同的東西存儲于同一個(gè)位置時(shí),就可以使用聯(lián)合。舉例說明用途。答:10) 聯(lián)合變量可以被初始化,但這個(gè)初始值必須是聯(lián)合第1個(gè)成員的類型,而且它必須位于一對花括號里面。例如,union int a; float b; char c4;x = 5;把x.a初始化為5. 請?jiān)诰幾g器進(jìn)行驗(yàn)證。答:1.1.11 使用結(jié)構(gòu)和指針 (ch11)1) 鏈表(linked list)就是一些

31、包含數(shù)據(jù)的獨(dú)立數(shù)據(jù)結(jié)構(gòu)(通常稱為節(jié)點(diǎn))的集合。鏈表中的每個(gè)節(jié)點(diǎn)通過鏈或指針連接在一起。程序通過指針訪問鏈表中的節(jié)點(diǎn)。請說說你所知道的使用鏈表的地方?答:2) 在單鏈表中,每個(gè)節(jié)點(diǎn)包含一個(gè)指向鏈表下一節(jié)點(diǎn)的指針。鏈表最后一個(gè)節(jié)點(diǎn)的指針字段的值為NULL, 提示鏈表后面不再有其它節(jié)點(diǎn)。在找到鏈表的第1個(gè)節(jié)點(diǎn)后,使用指針就可以訪問剩余的所有節(jié)點(diǎn)。為了標(biāo)記鏈表的起始位置,可以使用一個(gè)根指針(root pointer), 根指針指向鏈表的第1個(gè)節(jié)點(diǎn)。那么一般情況下根節(jié)點(diǎn)包含有效數(shù)據(jù)嗎?答:3) 鏈表中的節(jié)點(diǎn)可能分布于內(nèi)存中的各個(gè)地方。對于一個(gè)處理鏈表的程序而言,各節(jié)點(diǎn)在物理上是否相鄰并沒有什么區(qū)別,因?yàn)?/p>

32、程序始終用鏈(指針)從一個(gè)節(jié)點(diǎn)移動到另一個(gè)節(jié)點(diǎn)。如果要對鏈表進(jìn)行隨機(jī)性的訪問,那么你覺得它的效率如何?答:4) 在一個(gè)雙向鏈表中,每個(gè)節(jié)點(diǎn)都包含兩個(gè)指針-指向前一個(gè)節(jié)點(diǎn)的指針和指向后一個(gè)節(jié)點(diǎn)的指針。這可以使得我們能以任何方向遍歷雙鏈表,甚至可以忽前忽后地在雙鏈表中訪問。這在一些特殊的場合非常有實(shí)際的使用價(jià)值,請舉出一個(gè)你所知道的使用雙向鏈表的例子,體會這種數(shù)據(jù)結(jié)構(gòu)的特點(diǎn)。答:5) 對于單鏈表和雙鏈表的建立、插入和刪除操作,結(jié)合標(biāo)準(zhǔn)C語言教程和本章1.2節(jié)練習(xí)題目內(nèi)容,要求務(wù)必熟練掌握。答:1.1.12 高級指針話題 (ch12)1) 談?wù)勀銓χ赶蛑羔樀闹羔樀木唧w含義的理解。答:2) 請解釋以下

33、各指針聲明的含義:int *f(); int (*f)(); int *(*f)();答:3) 談?wù)勀銓@些指針的聲明的理解:int f; int *f; int (*f)(); int *(*f)();答:4) 對函數(shù)指針初始化,表達(dá)式int (*pf)(int) = &f; 中的 & 操作符可以省略嗎?答:5) 重點(diǎn)理解標(biāo)準(zhǔn)C語言教程 回調(diào)函數(shù) 一節(jié),說說函數(shù)指針最常見的使用場合。答:6) 當(dāng)一個(gè)字符串常量出現(xiàn)于表達(dá)式中時(shí),它的值是個(gè)指針常量。你對這個(gè)表述如何理解?答:7) 對于字符串常量表達(dá)式:xyz + 1; 它的結(jié)果是什么?給出你的解釋。答:8) *xyz; 這個(gè)間接訪問的結(jié)果是什么

34、?答:9) xyz2; 表達(dá)式的值是什么?答:10) *(xyz + 4); 表達(dá)式合法嗎?說說理由。答:11) 對于表達(dá)式:putchar(0123456789ABCEFvalue % 16); 請給出你的理解。答:1.1.13 位操作 (ch13)1) 4個(gè)位運(yùn)算符:, &, |, , 都用于整型數(shù)據(jù),包括char類型,那么對浮點(diǎn)類型合適嗎?答:2) 二進(jìn)制反碼或按位取反:, 假設(shè)val是一個(gè)unsigned char, 已賦值為2, 在二進(jìn)制中,2是00000010. 于是val的值為11111101, 或253. 該運(yùn)算符會改變val的值嗎?如果要改變val的值,應(yīng)當(dāng)怎么做?答:3)

35、請給出以下操作的結(jié)果:a) 位與(AND): (10010011) & (00111101); b) 位或(OR): (10010011) | (00111101); c) 位異或: (10010011) (00111101); 答:4) 掩碼是某些位設(shè)為開(1)而某些位設(shè)置為關(guān)(0)的位組合?!拔慌c”運(yùn)算符通常跟掩碼一起使用。例如:ch &= 0xff; 該掩碼留下ch的最后8位,將其余設(shè)為0. 無論最初的ch是8位、16位或是更多,都將最終的值修整到一個(gè)字節(jié)中。在這個(gè)例子中,掩碼寬度為幾位?答:5) 關(guān)閉一些位而不影響其它位的,同時(shí)能夠?qū)⑻囟ǖ奈魂P(guān)閉與能夠?qū)⑻囟ǖ奈淮蜷_一樣有用。那么要關(guān)閉

36、指定的位應(yīng)當(dāng)使用什么操作,給出示例。答:6) 轉(zhuǎn)置(toggling)一個(gè)位表示如果該位是打開狀態(tài),則關(guān)閉該位,如果該位是關(guān)閉狀態(tài),則打開該位。可以使用什么運(yùn)算符來轉(zhuǎn)置一個(gè)位?給出示例。答:7) 查看一位的值:必須屏蔽flag中的其它位,以便只把flag中的位1和MASK相比較,試著給出查看位1的示例代碼。答:8) 位操作中,為了避免信息越界,位掩碼至少應(yīng)該與其所屏蔽的值具有相同的寬度。你對這個(gè)論述如何理解?答:9) 左移運(yùn)算符 將其左側(cè)操作數(shù)的值的每位向右移動,移動的位數(shù)由其右側(cè)操作數(shù)指定。丟棄移出左側(cè)操作數(shù)右端的位。對于unsigned類型,使用0填充左端空出的位。對于有符號類型,結(jié)果依賴

37、于機(jī)器,空出的位可能用0填充,或者使用符號(最左端的)位的副本填充。請檢驗(yàn)?zāi)闼褂玫臋C(jī)器填充的是0還是1 ?答:11) 對于位字段(bit field), 如果所聲明位段總位數(shù)超過一個(gè)unsigned int大小,那么將會發(fā)生什么?該位段會使用下一個(gè)unsigned int的存儲位置。C不允許一個(gè)字段跨越兩個(gè)unsigned int之間的邊界。編譯器會自動地移位這樣的字段定義,使該字段按unsigned int邊界對齊。請?jiān)跈C(jī)器上進(jìn)行驗(yàn)證。答:1.1.14 文件操作 (ch14)1) C將文件看成是連續(xù)的字節(jié)序列,其中每一個(gè)字節(jié)都可以單獨(dú)地讀取。ANSI C提供了文件的兩種格式:文本格式和二進(jìn)制格式。請分別描述這兩種格式的特點(diǎn)。答:2) C程序運(yùn)行時(shí)會自動打開3個(gè)文件。這3個(gè)文件被稱為標(biāo)準(zhǔn)輸入(standard input), 標(biāo)準(zhǔn)輸出(standard output)和標(biāo)準(zhǔn)錯誤輸出(standard error output). 默認(rèn)的標(biāo)準(zhǔn)輸入是系統(tǒng)的一般輸入設(shè)備,通

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論