爲考研準備整理,參考網絡資料課本資料,主要是c的簡答開放題目有用的話可以點個贊,可以看着目錄嘗試自己回答後在進行往下看
目錄
指針與地址有什麼聯繫?在使用指針的過程中應注意哪些細節?指針類型對於程序設計有哪些意義?
#include 與 #include “file.h”的區別?
特點
簡潔緊湊、靈活方便;運算符豐富;數據結構豐富
C是結構式語言;C語法限制不太嚴格、程序設計自由度大
C語言允許直接訪問物理地址,可以直接對硬件進行操作;C語言程序生成代碼質量高,程序執行效率高
C語言適用範圍大,可移植性好;具有預處理功能;具有遞歸功能
c語言具有繪圖能力和強大的數據處理能力,它是數值計算的高級語言
c 語言的主要用途:
C語言可以用來開發許多系統軟件和大型應用軟件。如UNIX,LINUX等操作系統。 在軟件需要對硬件進行操作的場合,用C語言明顯優於其它高級語言。例如,各種硬件設備的驅動程序(象顯卡驅動程序、打印機驅動程序等)一般都是用C語言編寫的。 在圖形、圖像及動畫處理方面,C語言具有絕對優勢,特別是遊戲軟件的開發主要就是使用C語言。 隨着計算機網絡飛速發展,特別是Internet的出現,計算機通信就顯得尤其重要,而通信程序的編制首選就是C語言。 C語言適用於多種操作系統,象WINDOWS、UNIX、LINUX等絕大多數操作系統都支持C語言,其它高級語言未必能得到支持,所以在某個特定操作系統下運行的軟件用C語言編制是最佳選擇。
c語言爲什麼要規定,對所有使用的變量要“先定義,後使用”?
程序中使用的各種變量都應預先加以說明,即先說明,後使用。對變量的說明可以包括三個方面:?數據類型?存儲類型?作用域
數據類型決定數據所佔內存字節數,數值取值範圍,在其上可進行的操作。
對變量先定義後使用的目的是:
1)凡是未被事先定義的不做爲變量名,這就能保證程序中變量名使用得正確,便於編譯時發現錯誤,避免變量名使用時出錯。
2)每個變量被指定一確定類型,在編譯時就能爲其分配相應的存儲單元。
3)指定每一個變量屬於一個類型,便於在編譯時據此檢查該變量所進行的運算是否合法。
爲什麼使用符號常量
1)簡化書寫格式、減少出錯率。
2)定義符號常量可以提高程序的可讀性,便於程序的調試和修改。
3)符號常量不同於變量,在其作用域內不能被改變和重新賦值。
4)習慣上人們把符號常量名用大寫字母表示,變量用小寫,以示區別
寫出一個程序的組成
程序名、預編譯指令、標準的輸入輸出、c語言的主函數、函數開始標誌、定義變量、給變量賦值、輸出結果、程序正常結束、函數結束標誌
內存分配方式有三種:
1、從靜態存儲區域分配。內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在。例如全局變量,static變量。
2、在棧上創建。在執行函數時,函數內局部變量的存儲單元都可以在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置於處理器的指令集中,效率很高,但是分配的內存容量有限。
3、從堆上分配,亦稱動態內存分配。程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現內存泄漏,頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊
c語言中變量的存儲類別
變量的存儲類別爲兩大類,靜態存儲和動態存儲 具體有自動auto,寄存器register和靜態static和外部extern 局部缺省爲auto變量
標識符作用域
全局變量 是在函數外定義的變量,作用域從定義它的位置到整個源文件結束爲止, 生存期爲整個程序運行期間。全局變量都是靜態變量
局部變量有三種類型:自動auto,寄存器register和靜態static。 自動變量隨着函數的使用與否創建消失;寄存器變量分配在cpu中,沒有內存地址; 靜態變量佔用固定存儲單元,在程序執行過程不釋放,直到程序運行結束
關鍵字static的作用是什麼? 關鍵字static有三個明顯的作用:
1). 在函數體,一個被聲明爲靜態的變量在這一函數被調用過程中維持其值不變。
2). 在模塊內(但在函數體外),一個被聲明爲靜態的變量可以被模塊內所用函數訪問,但不能被模塊外其它函數訪問。它是一個本地的全局變量。
3). 在模塊內,一個被聲明爲靜態的函數只可被這一模塊內的其它函數調用。那就是,這個函數被限制在聲明它的模塊的本地範圍內使用。
C語言中,動態存儲區主要存放哪些數據?
答:動態存儲區中存放以下數據:
1) 函數的形參
2) 函數調用時的現場保護和地址等。
3) Auto register型局部變量
對以上數據,當進行函數調用時分配動態存儲空間,當函數調用結束時,釋放這些存儲單元。在程序的執行過程中,這種分配和釋放是動態的。
strlen與sizeof的區別:
1、strlen計算字符串的具體長度(只能是字符串),不包括字符串結束符。返回的是字符個數。
2、sizeof計算聲明後所佔的內存數(字節大小),不是實際長度。
3、sizeof是一個取字節運算符,而strlen是個函數。
4、sizeof的返回值=字符個數*字符所佔的字節數,字符實際長度小於定義的長度,此時字符個數就等於定義的長度。若未給出定義的大小,分類討論,對於字符串數組,字符大 小等於實際的字符個數+1;對於整型數組,字符個數爲實際的字符個數。字符串每個字符佔1個字節,整型數據每個字符佔的字節數需根據系統的位數類確定,32位佔4個字節。
C 語言以函數爲程序的基本單位,有什麼好處?
函數是程序的基本組成單位,可以用函數作爲程序模塊來實現c語言程序。利用函數不僅可以使程序模塊化,而且可以使程序設計的簡單和直觀,提高程序的可讀性和可維護性。還可以把程序中的一些計算編成通用函數,以供隨時使用。
關鍵字和一般標識符有什麼不同?
標識符用來標識源程序中的某個對象的名字,一個標識符由字母、數字和下劃線組成。關鍵字可以定義變量、表達式語句功能和對一些文件進行預處理,關鍵字已被編譯系統本身使用,所以用戶編寫程序時不能夠使用這些關鍵字來作爲標識符,如int,if,for等。
循環相關
if語句中的條件表達式可以是任意的合法表達式嗎?Switch語句中break的作用是什麼?
可以是任意數值。在switch語句中,break語句可使流程立即跳出switch語句體不執行其他的case。
三種循環結構中的條件是循環進行的條件還是循環結束的條件?循環結構中break語句和continue語句的作用是什麼,二者有何區別?
for語句、while語句:循環進行的條件;do-while語句:循環結束的條件;break可用於switch語句,表示跳出整個switch塊,而continue則不能用於switch語句,它們都可用於循環語句的循環體,break用於立即退出當前循環,而continue僅跳過當次循環,本次循環體內不執行continue語句後的其他語句,但下次循環還會執行。
字符數組與字符串是否相同?若不相同,有何區別?
不相同,C語言中沒有專門的字符串變量,如果要將一個字符串存放在變量中,必須使用字符數組,即用一個字符型數組來存放一個字符串,數組中每一個元素放一個字符。字符串必須以’\0’結尾,字符數組可以包含多個’\0’
函數的嵌套調用與遞歸調用有什麼區別?
函數嵌套允許在一個函數中調用另外一個函數,遞歸調用是調用本身的函數。函數嵌套就是函數調用函數,是普遍的,遞歸就是函數調用自身,是函數嵌套的一個特例。
結構體類型與我們前面學過的基本類型有哪些區別?
結構體是一個可以包含不同數據類型的一個結構,它是一種可以自己定義的數據類型。
特點:1、結構體可以在一個結構體中聲明不同的數據類型;
2、相同的結構的結構體變量可以相互賦值,而數組不行,因爲數組是單一數據類型的數據集合,它本身不是數據類型(而結構體是),數組名稱是常量指針,所以不可以做爲左值進行運算,所以數組之間就不能通過數組名稱相互複製,即使數據類型和數組大小完全相同。
3、節省內存空間。4、高效率。
指針與地址有什麼聯繫?在使用指針的過程中應注意哪些細節?指針類型對於程序設計有哪些意義?
指針保存了某個變量的地址,指針本身是一個變量,它也有自身的地址,而指針的內容是某個變量的地址。
注意細節:要初始化、正確的傳遞地址方式、使用時要判斷。指針可以用來有效地表示覆雜的數據結構,可以用於函數參數傳遞並達到更加靈活使用函數的目的,使C語言程序設計具有靈活、實用、高效的特點。
指針和引用
1) 引用必須被初始化,指針不必。 2) 引用初始化以後不能被改變,指針可以改變所指的對象。 3) 不存在指向空值的引用,但是存在指向空值的指針。 指針通過某個指針變量指向一個對象後,對它所指向的變量間接操作。程序中使用指針,程序的可讀性差;而引用本身就是目標變量的別名,對引用的操作就是對目標變量的操作
描述一下gcc的編譯過程?
gcc編譯過程分爲4個階段:預處理、編譯、彙編、鏈接。 預處理:頭文件包含、宏替換、條件編譯、刪除註釋 編譯:主要進行詞法、語句、語義分析等,檢查無誤後將預處理好的文件編譯成彙編文件。 彙編:將彙編文件轉換成二進制目標文件 鏈接:將項目中的各個二進制文件+所需的庫+啓動代碼鏈接成可執行文件。
c的執行過程
(1) file.c是源文件,通過編輯得到; (2) file.obj 是目標文件,即計算機能夠處理的由二進制指令組成的文件,通過對源文件進行編譯得到; (3) file.exe 是可執行文件,通過將目標文件與其他目標文件或庫函數連接得到。
內存的最小存儲單位以及內存的最小計量單位分別是?
內存的最小存儲單位爲二進制,內存的最小計量單位是字節
變量的聲明與定義有什麼區別
聲明變量 不需要建立存儲空間,變量的定義需要建立存儲空間。爲變量分配地址和存儲空間的稱爲定義,不分配地址的稱爲聲明。一個變量可以在多個地方聲明,但是隻在一個地方定義。加入 extern 修飾的是變量的聲明,說明此變量將在文件以外或在文件後面部分定義。
說明:很多時候一個變量,只是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間,如外部變量。
C語言中進行函數聲明的作用是什麼?
答:函數聲明的作用是:把函數的名字、函數類型及形參類型、個數和順序通知編譯系統,以便在調用該函數時系統按此進行對照和檢查(例如,函數名是否正確,實參的類型和個數是否一致)。
簡述C語言的隱式類型轉換髮生的四種情況。
- 算術運算式中,低類型能轉換爲高類型。
- 賦值表達式中,右邊表達式的值自動隱式轉換爲左邊變量的類型,並賦值給它。
- 函數調用中參數傳遞時,系統隱式地將實參轉換爲形參的類型後,賦給形參。
- 函數有返回值的時候,系統隱式的將返回表達式類型轉換爲返回值類型,賦給調用函數
&&和&、||和|有什麼區別?
1、&和|對操作數進行求值運算,&&和||只是判斷邏輯關係。 2、&&和||在在判斷左側操作數就能確定結果的情況下就不再對右側操作數求值。
typedef 和 define 有什麼區別
1、用法不同:typedef 用來定義一種數據類型的別名,增強程序的可讀性。define 主要用來定義常量,以及書寫複雜使用頻繁的宏。 2、執行時間不同:typedef 是編譯過程的一部分,有類型檢查的功能。define 是宏定義,是預編譯的部分,其發生在編譯之前,只是簡單的進行字符串的替換,不進行類型的檢查。 3、作用域不同:typedef 有作用域限定。define 不受作用域約束,只要是在 define 聲明後的引用都是正確的。 4、對指針的操作不同:typedef 和 define 定義的指針時有很大的區別。 5、typedef 定義是語句,因爲句尾要加上分號。而 define 不是語句,千萬不能在句尾加分號。
請說出const與#define 相比,有何優點?
答:Const作用:定義常量、修飾函數參數、修飾函數返回值三個作用。被Const修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。 1) const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對後者只進行字符替換,沒有類型安全檢查,並且在字符替換可能會產生意料不到的錯誤。 2) 有些集成化的調試工具可以對const 常量進行調試,但是不能對宏常量進行調試
#include 與 #include “file.h”的區別?
答:前者是從Standard Library的路徑尋找和引用file.h,而後者是從當前工作路徑搜尋並引用file.h。
用兩個棧實現一個隊列的功能?要求給出算法和思路!
答 、設2個棧爲A,B, 一開始均爲空. 入隊: 將新元素push入棧A; 出隊: (1)判斷棧B是否爲空; (2)如果不爲空,則將棧A中所有元素依次pop出並push到棧B; (3)將棧B的棧頂元素pop出; 這樣實現的隊列入隊和出隊的平攤複雜度都還是O(1), 比上面的幾種方法要好