哈嘍,前幾篇文章將c語言基礎 簡單的寫了寫,不知道大家能不能理解哈,今天更新下c語言的一些常見面試題,希望能幫助到大家。
1、描述⼀下gcc的編譯過程?
預處理:頭⽂件包含、巨集替換、條件編譯、刪除注釋
編譯:主要進⾏詞法、語法、語義分析等,檢查⽆誤後將預處理好的⽂件編譯成彙編⽂件。
彙編:將彙編⽂件轉換成 ⼆進製⽬標⽂件
2、記憶體的最⼩儲存單位以及記憶體的最⼩計量單位分別是?
記憶體的最⼩儲存單位為 ⼆進製位, 記憶體的最⼩計量單位 位元組3、#include<> 與#include ""的區別?
include<>到系統指定⽬錄尋找頭⽂件,#include ""先到項⽬所在⽬錄尋找頭⽂件,如果沒有找再到系統指定的⽬錄下尋找4、描述⼀下變數的命名規則
變數名有字⺟、數值、下劃線組成,但不能以數值開頭5、變數的宣告與定義有啥區別?
宣告變數 不需要 建⽴儲存空間, 變數的定義需要建⽴儲存空間6、談談c語⾔中有符號和⽆符號的區別?
有符號:資料的最⾼位為符號位,0表示正數,1表示負數7、談談計算機中補碼的意義⽆符號:資料的最⾼位不是符號位,⽽是資料的⼀部分
統⼀了零的編碼8、談談陣列的特點將符號位與其他位統⼀處理將減法運算轉換成加法運算
同⼀個陣列所有的成員都是相同的資料型別,同時所有的成員在記憶體中的位址是連續的9、陣列的分類
陣列的分類主要是:靜態陣列、動態陣列兩類。10、描述⼀下⼀維陣列的不初始化、部分初始化、完全初 始化的不同點靜態陣列:類似int arr[5];在程式運⾏就確定了陣列的⼤⼩,運⾏過程不能更改陣列的⼤⼩。
動態陣列:主要是在堆區申請的空間,陣列的⼤⼩是在程式運⾏過程中確定,可以更改陣列的⼤⼩。
不初始化:如果是區域性陣列 陣列元素的內容隨機 如果是全域性陣列,陣列的元素內容為011、談談陣列名作為型別、作為位址、對陣列名取位址的 區別?部分初始化:未被初始化的部分⾃動補0
完全初始化:如果⼀個陣列全部初始化 可以省略元素的個數 陣列的⼤⼩由初始化的個數確定
陣列名作為型別:代表的是整個陣列的⼤⼩12、談談你對⼆維陣列在物理上以及邏輯上的陣列維度理解
⼆維陣列在邏輯上是⼆維的,在物理上是⼀維的13、描述⼀下函式的定義與函式的宣告的區別
函式定義:是指對函式功能的確⽴,包括指定函式名、函式型別、形參及其型別、函式體等,它是⼀個完整的、獨⽴的函式單位。14、描述⼀下指標與指標變數的區別函式的宣告:是把函式的名字、函式型別以及形參的個數、型別和順序(注意,不包括函式體)通知編譯系統,以便在對包含函式調⽤的語句進⾏編譯時,據此對其進⾏對照檢查(例如函式名是否正確,實參與形參的型別和個數是否⼀致)
15、描述⼀下32位或64位平台下指標的⼤⼩
32位平台:任意型別的指標⼤⼩為4位元組16、描述⼀下指標陣列的概念64位平台:任意型別的指標⼤⼩為8位元組
指標陣列本質是陣列,只是陣列的每個元素是⼀個指標(位址)17、描述⼀下普通區域性變數、普通全域性變數、靜態區域性變數、靜態全域性變數的區別
普通區域性變數: 存在棧區、不初始化內容隨機、只在定義所在的復合語句中有效、符合語句結束變數空間釋放18、描述⼀下記憶體分割槽普通全域性變數 :存在全域性區、不初始化內容為0、程序結束空間才被釋放,能被當前源⽂件或其他源⽂件使⽤,只是其他源⽂件使⽤的時候,記得使⽤extern修飾
靜態區域性變數: 存在全域性區、不初始化內容為0、整個程序結束空間才被釋放,只能在定義所在的復合語句中有效
靜態全域性變數 :存在全域性區、不初始化內容為0、整個程序結束空間才被釋放,只能被當前源⽂件使⽤
程式在運⾏前:分為**區、bss段(未初始化資料區)、data段(初始化資料區)19、在使⽤realloc給已分配的堆區空間追加空間時需要注意啥?程式在運⾏後:堆區、棧區、全域性區(靜態區)、⽂字常量區、**區
記得⽤指標變數儲存realloc的返回值20、結構體與共⽤體的區別是啥
結構體中的成員擁有獨⽴的空間,共⽤體的成員共享同⼀塊空間,但是每個共⽤體成員能訪問共⽤區的空間⼤⼩是由成員⾃身的型別決定21、談談⽂件的分類21、談談⽂件的分類
⽂件分為⼆進製和⽂本⽂件22、⽂件緩衝區重新整理⽅式有⼏種⼆進製⽂件基於值編碼,需要根據具體的應⽤才能知道某個值具體的含義
⽂本⽂件基於字元編碼,⼀個位元組⼀個意思,可以通過記事本開啟
⾏重新整理、滿重新整理、強制重新整理、關閉重新整理23、哪些情況下會出現野指標
指標變數未初始化、指標釋放後未為置空、指標操作超越變數作⽤域24、如何理解指標作為函式引數的輸⼊和輸出特性
輸⼊特性:主調函式分配空間 背調函式使⽤該空間25、如何理解結構體的淺拷⻉與深拷⻉輸出特性:被調⽤分配空間 主調函式使⽤該空間
當結構體中有指標成員的時候容易出現淺拷⻉與深拷⻉的問題。26、描述⼀下結構體對⻬規則淺拷⻉就是,兩個結構體變數的指標成員指向同⼀塊堆區空間,在各個結構體變數釋放的時候會出現多次釋放同⼀段堆區空間
深拷⻉就是,讓兩個結構體變數的指標成員分別指向不同的堆區空間,只是空間內容拷⻉⼀份,這樣在各個結構體變數釋放的時候就不會出現多次釋放同⼀段堆區空間的問題
1. 陣列成員對⻬規則。第⼀個數組成員應該放在offffset為0的地⽅,以後每個陣列成員應該放在offffset 為min(當前成員的⼤⼩,#pargama pack(n))整數倍的地⽅開始(⽐如int在32位機器為4位元組,#pargama pack(2),那麼從2的倍數地⽅開始儲存)。27、啥叫巨集函式以及作⽤2. 結構體總的⼤⼩,也就是sizeof的結果,必須是min(結構體內部最⼤成員,#pargama pack(n))的整數倍,不⾜要補⻬。
3. 結構體做為成員的對⻬規則。如果⼀個結構體b⾥巢狀另⼀個結構體a,還是以最⼤成員型別的⼤⼩對⻬,但是結構體a的起點為a內部最⼤成員的整數倍的地⽅。(struct b⾥存有struct a,a⾥有 char,int,double等成員,那a應該從8的整數倍開始儲存。),結構體a中的成員的對⻬規則仍 滿⾜原則1、原則2。
在項⽬中,經常把⼀些短⼩⽽⼜頻繁使⽤的函式寫成巨集函式,這是由於巨集函式沒有普通函式引數壓棧、跳轉、返回等的開銷,可以調⾼程式的效率。 巨集通過使⽤引數,可以建立外形和作⽤都與函式類似地類 函式巨集(function-like macro). 巨集的引數也⽤圓括號括起來,來保證巨集函式的完整性。28、如何理解庫函式
庫是已經寫好的、成熟的、可復⽤的**。每個程式都需要依賴很多底層庫,不可能每個⼈的**從零開始編寫**,因此庫的存在具有⾮常重要的意義。 在我們的開發的應⽤中經常有⼀些公共**是需要反覆使⽤的,就把這些**編譯為庫⽂件。 庫可以簡單看成⼀組⽬標⽂件的集合,將這些⽬標⽂件經過壓縮打包之後形成的⼀個⽂件。像在windows這樣的平台上,最常⽤的c語⾔庫是由整合按開發環境所附帶的運⾏庫,這些庫⼀般由編譯⼚商提供
C語言面試題
基礎篇 1 區域性變數能否和全域性變數重名?可以2 如何引用乙個已經定義過的全域性變數?直接呼叫並初始化 3 全域性變數可不可以定義在可被多個.c檔案包含的標頭檔案中?為什麼?可以,6 堆和棧有什麼區別?7 什麼是預編譯,何時需要預編譯 8 c和c 中的struct有什麼不同?9 memset me...
C語言面試題
1.求某一年的某一天 includestruct sdate int main int i 0,nday dt.nday while i2 nday printf 這是 d年的第 d天 n dt.nyear,dt.nday return 0 將列印和演算法抽象成不同函式 includestruct ...
C語言面試題
1.要求使用一維陣列,輸入10名同學的序號和成績,並進行排序。題目1196 成績排序 題目描述 用一維陣列儲存學號和成績,然後,按成績排序輸出。輸入 輸入第一行包括乙個整數n 1 n 100 代表學生的個數。接下來的n行每行包括兩個整數p和q,分別代表每個學生的學號和成績。輸出 按照學生的成績從小到...