函數(shù)
1、如何理解庫(kù)函數(shù)
庫(kù)是已經(jīng)寫(xiě)好的、成熟的、可復(fù)用的代碼。每個(gè)程序都需要依賴很多底層庫(kù),不可能每個(gè)人的代碼從零開(kāi)始編寫(xiě)代碼,因此庫(kù)的存在具有非常重要的意義。在我們的開(kāi)發(fā)的應(yīng)用中經(jīng)常有一些公共代碼是需要反復(fù)使用的,就把這些代碼編譯為庫(kù)文件。庫(kù)可以簡(jiǎn)單看成一組目標(biāo)文件的集合,將這些目標(biāo)文件經(jīng)過(guò)壓縮打包之后形成的一個(gè)文件。像在Windows這樣的平臺(tái)上,最常用的c語(yǔ)言庫(kù)是由集成按開(kāi)發(fā)環(huán)境所附帶的運(yùn)行庫(kù),這些庫(kù)一般由編譯廠商提供
2、如何理解指針作為函數(shù)參數(shù)的輸入和輸出特性
輸入特性:主調(diào)函數(shù)分配空間 背調(diào)函數(shù)使用該空間
輸出特性:被調(diào)用分配空間 主調(diào)函數(shù)使用該空間
3、函數(shù)名的意義
在c語(yǔ)言中 函數(shù)名代表的是函數(shù)的入口地址
4、函數(shù)的形參和實(shí)參的區(qū)別
C++
int data1=0;
int data2=0;
int my_add(int x, int y)
{
return x+y;
}
int main()
{
my_add(data1,data2);
}
形參:在函數(shù)定義時(shí)候定義形參(例如:x,y),一般由形參類型和形參名組成。在定義函數(shù)是不會(huì)為形參開(kāi)辟空間,只有在函數(shù)調(diào)用時(shí)系統(tǒng)才會(huì)為形參開(kāi)辟空間
實(shí)參:在函數(shù)調(diào)用時(shí)傳遞給函數(shù)的實(shí)際參數(shù)(例如:data1,data2),他在函數(shù)調(diào)用前就存在的
5、函數(shù)的作用
將為同一功能服務(wù)的代碼,封裝在一起,通過(guò)函數(shù)名直接調(diào)用,提高代碼的重用
6、函數(shù)的定義與函數(shù)的聲明的區(qū)別
函數(shù)定義:是指對(duì)函數(shù)功能的確立,包括指定函數(shù)名、函數(shù)類型、形參及其類型、函數(shù)體等,它是一個(gè)完整的、獨(dú)立的函數(shù)單位。
函數(shù)的聲明:是把函數(shù)的名字、函數(shù)類型以及形參的個(gè)數(shù)、類型和順序(注意,不包括函數(shù)體)通知編譯系統(tǒng),以便在對(duì)包含函數(shù)調(diào)用的語(yǔ)句進(jìn)行編譯時(shí),據(jù)此對(duì)其進(jìn)行對(duì)照檢查(例如函數(shù)名是否正確,實(shí)參與形參的類型和個(gè)數(shù)是否一致)
7、從定義的角度為函數(shù)分類
庫(kù)函數(shù)(c語(yǔ)言庫(kù))、自定義函數(shù)、系統(tǒng)調(diào)用(內(nèi)核提供給用戶的函數(shù)接口)
8、從有無(wú)參數(shù)的角度對(duì)函數(shù)分類
無(wú)參的函數(shù):不能將函數(shù)外部的數(shù)據(jù) 傳遞 給函數(shù)內(nèi)部
有參的函數(shù):通過(guò)參數(shù) 將函數(shù)外部的數(shù)據(jù) 傳遞到函數(shù)內(nèi)部
(參數(shù):函數(shù)外部數(shù)據(jù) 到 函數(shù)內(nèi)部的 橋梁)
9、普通變量作為函數(shù)的參數(shù)特點(diǎn)
函數(shù)內(nèi)部可以借助函數(shù)的參數(shù)使用外部變量的值,但是函數(shù)內(nèi)部不能通過(guò)形參間接修改外部變量的值(單向傳遞中的值傳遞)
10、一維數(shù)組作為函數(shù)的參數(shù)的特點(diǎn)
數(shù)組作為函數(shù)的參數(shù),會(huì)被優(yōu)化成數(shù)組元素指針變量,在調(diào)用函數(shù)的時(shí)候?qū)崊⒅恍枰獋鬟f數(shù)組的首元素地址就可以操作數(shù)組的所有元素
11、在32位平臺(tái)Void func(int arr[5]){}則sizeof(arr)的結(jié)果
4字節(jié)
12、二維數(shù)組作為函數(shù)的特點(diǎn)
二維數(shù)組作為函數(shù)的參數(shù)會(huì)被優(yōu)化成數(shù)組指針,函數(shù)內(nèi)部可以借助該數(shù)組指針操作二維數(shù)組的所有元素。在操作數(shù)組元素上該數(shù)組指針等價(jià)于函數(shù)外部的二維數(shù)組名
字符串
宏函數(shù)以及作用
在項(xiàng)目中,經(jīng)常把一些短小而又頻繁使用的函數(shù)寫(xiě)成宏函數(shù),這是由于宏函數(shù)沒(méi)有普通函數(shù)參數(shù)壓棧、跳轉(zhuǎn)、返回等的開(kāi)銷,可以調(diào)高程序的效率。宏通過(guò)使用參數(shù),可以創(chuàng)建外形和作用都與函數(shù)類似地類函數(shù)宏(function-like macro). 宏的參數(shù)也用圓括號(hào)括起來(lái),來(lái)保證宏函數(shù)的完整性。
strlen和sizeof的區(qū)別
strlen是測(cè)量字符串長(zhǎng)度(不包含'\0'),sizeof是測(cè)量類型大小(包含‘\0’)
字符串的結(jié)束標(biāo)記
一般將'\0'作為字符串的結(jié)束標(biāo)記,以str開(kāi)頭的字符串操作函數(shù)默認(rèn)遇到'\0'結(jié)束調(diào)用
字符串的常用操作
字符串拷貝(strcpy),比較(strcmp)、拼接(strcat)、查找(strchr,strstr)、 長(zhǎng)度(strlen)、獲取子串(strtok)
在使用realloc給已分配的堆區(qū)空間追加空間時(shí)需要注意啥
realloc給定的空間大小必須是新空間+舊空間的大小
記得用指針變量保存realloc的返回值
宏函數(shù)和普通函數(shù)的區(qū)別
普通函數(shù)只有一份,在調(diào)用的時(shí)候?yàn)楹瘮?shù)內(nèi)部數(shù)據(jù)分配空間,每次調(diào)用函數(shù)是獨(dú)立的。函數(shù)在調(diào)用的時(shí)候存在出入棧的開(kāi)銷。函數(shù)的形參有類型 能保證參數(shù)的整型
宏函數(shù):本質(zhì)是宏 而不是函數(shù),他是在預(yù)處理階段展開(kāi),多次調(diào)用,展開(kāi)多次,沒(méi)有函數(shù)調(diào)用時(shí)的"出入棧"開(kāi)銷。宏函數(shù)的參數(shù)沒(méi)有參數(shù)不能保證參數(shù)的完整性
條件編譯的作用
條件編譯的作用:在編譯階段有選擇的編譯我們的源碼,達(dá)到同一個(gè)源碼裁剪出不同的功能
以str開(kāi)頭的字符串操作函數(shù)的特點(diǎn)
字符串的操作函數(shù)基本都是傳遞字符串首元素地址
字符串的操作函數(shù)基本都是遇到'\0'結(jié)束操作
結(jié)構(gòu)體共用體枚舉
描述結(jié)構(gòu)體對(duì)齊規(guī)則
1. 數(shù)組成員對(duì)齊規(guī)則。第一個(gè)數(shù)組成員應(yīng)該放在offset為0的地方,以后每個(gè)數(shù)組成員應(yīng)該放在offset為min(當(dāng)前成員的大小,#pargama pack(n))整數(shù)倍的地方開(kāi)始(比如int在32位機(jī)器為4字節(jié),#pargama pack(2),那么從2的倍數(shù)地方開(kāi)始存儲(chǔ))。
2. 結(jié)構(gòu)體總的大小,也就是sizeof的結(jié)果,必須是min(結(jié)構(gòu)體內(nèi)部最大成員,#pargama pack(n))的整數(shù)倍,不足要補(bǔ)齊。
3. 結(jié)構(gòu)體做為成員的對(duì)齊規(guī)則。如果一個(gè)結(jié)構(gòu)體B里嵌套另一個(gè)結(jié)構(gòu)體A,還是以最大成員類型的大小對(duì)齊,但是結(jié)構(gòu)體A的起點(diǎn)為A內(nèi)部最大成員的整數(shù)倍的地方。(struct B里存有struct A,A里有char,int,double等成員,那A應(yīng)該從8的整數(shù)倍開(kāi)始存儲(chǔ)。),結(jié)構(gòu)體A中的成員的對(duì)齊規(guī)則仍滿足原則1、原則2。
如何理解結(jié)構(gòu)體的淺拷貝與深拷貝
當(dāng)結(jié)構(gòu)體中有指針成員的時(shí)候容易出現(xiàn)淺拷貝與深拷貝的問(wèn)題。
淺拷貝就是,兩個(gè)結(jié)構(gòu)體變量的指針成員指向同一塊堆區(qū)空間,在各個(gè)結(jié)構(gòu)體變量釋放的時(shí)候會(huì)出現(xiàn)多次釋放同一段堆區(qū)空間
深拷貝就是,讓兩個(gè)結(jié)構(gòu)體變量的指針成員分別指向不同的堆區(qū)空間,只是空間內(nèi)容拷貝一份,這樣在各個(gè)結(jié)構(gòu)體變量釋放的時(shí)候就不會(huì)出現(xiàn)多次釋放同一段堆區(qū)空間的問(wèn)題
描述枚舉
關(guān)鍵字enum,將枚舉變量將要賦值的值 一一用符號(hào)常量(枚舉值)列舉出來(lái)。枚舉變量盡量賦值為給定的符號(hào)常量(枚舉值)
描述共有體
以關(guān)鍵字union修飾,共有體又叫聯(lián)合體,共有體中的成員共享同一塊內(nèi)存空間。
內(nèi)存空間總大小由共用體中最大的成員類型決定,每個(gè)成員能夠操作的空間大小是由成員自身類型大小決定
描述結(jié)構(gòu)體
以關(guān)鍵字struct修飾,結(jié)構(gòu)體中的成員擁有各自獨(dú)立的空間,按照(結(jié)構(gòu)體對(duì)齊規(guī)則)存儲(chǔ)在內(nèi)存中
結(jié)構(gòu)體中的成員類型可以不同
結(jié)構(gòu)體與共用體的區(qū)別
結(jié)構(gòu)體中的成員擁有獨(dú)立的空間,共用體的成員共享同一塊空間,但是每個(gè)共用體成員能訪問(wèn)共用區(qū)的空間大小是由成員自身的類型決定
結(jié)構(gòu)體變量初始化時(shí)需要注意啥
結(jié)構(gòu)體變量的初始化 必須遵循結(jié)構(gòu)體成員的順序以及成員的自身類型
談?wù)勀銓?duì)結(jié)構(gòu)體數(shù)組的理解
結(jié)構(gòu)體數(shù)組:本質(zhì)是數(shù)組,數(shù)組的每個(gè)元素為結(jié)構(gòu)體變量。
談?wù)勀銓?duì)結(jié)構(gòu)體位域的理解
在結(jié)構(gòu)體中,以位為單位的成員,咱們稱之為位段(位域)
不能對(duì)位域取地址
對(duì)位域賦值 不要超過(guò) 位域本身位的寬度
談?wù)勀銓?duì)鏈表的理解
鏈表是由一個(gè)個(gè)節(jié)點(diǎn)組成,節(jié)點(diǎn)沒(méi)有名字,每個(gè)節(jié)點(diǎn)從堆區(qū)動(dòng)態(tài)申請(qǐng),節(jié)點(diǎn)間物理上是非連續(xù)的,但是每個(gè)節(jié)點(diǎn)通過(guò)指針域 保存下一個(gè)節(jié)點(diǎn)的位置 達(dá)到邏輯上連續(xù)
談?wù)剶?shù)組和鏈表的不同點(diǎn)
數(shù)組通過(guò)下標(biāo)能夠快速遍歷數(shù)組的每個(gè)元素(訪問(wèn)效率高),但是當(dāng)數(shù)組插入或刪除數(shù)據(jù)時(shí)需要移動(dòng)大量的數(shù)據(jù)(插入刪除效率低)
鏈表通過(guò)指針域逐個(gè)節(jié)點(diǎn)的訪問(wèn)數(shù)據(jù)(訪問(wèn)效率低),但是當(dāng)鏈表插入或刪除節(jié)點(diǎn)不需要移動(dòng)節(jié)點(diǎn)(插入刪除效率高)
文件操作
文件緩沖區(qū)刷新方式有幾種
行刷新、滿刷新、強(qiáng)制刷新、關(guān)閉刷新
文件的分類
文件分為二進(jìn)制和文本文件
二進(jìn)制文件基于值編碼,需要根據(jù)具體的應(yīng)用才能知道某個(gè)值具體的含義
文本文件基于字符編碼,一個(gè)字節(jié)一個(gè)意思,可以通過(guò)記事本打開(kāi)
二進(jìn)制文件和文本文件的區(qū)別
文本文件:
基于字符編碼,常見(jiàn)編碼有 ASCII、UNICODE 等 ,一般可以使用文本編輯器直接打開(kāi) 例如:數(shù) 5678 的以 ASCII 存儲(chǔ)形式為: ASCII 碼:00110101 00110110 00110111 00111000
二進(jìn)制文件:
基于值編碼,把內(nèi)存中的數(shù)據(jù)原樣輸出到磁盤上,一般需要自己判斷或使用特定軟件分析數(shù)據(jù)格式例如:數(shù) 5678 的存儲(chǔ)形式為: 二進(jìn)制碼:00010110 00101110
c語(yǔ)言中fopen打開(kāi)文件的模式(mode)有哪些
文件的打開(kāi)方式mode:r w a + t b
r:只讀的方式打開(kāi) w:只寫(xiě)的方式打開(kāi) a:追加的方式打開(kāi) +:可讀可寫(xiě)方式打開(kāi)
t:以文本文件方式打開(kāi) (默認(rèn)是省略)
b:以二進(jìn)制方式打開(kāi)(必須顯示說(shuō)明)
對(duì)FILE*文件指針讀寫(xiě)的API
Fgetc 和fputc 一次讀寫(xiě)一個(gè)字符
fgets和fputs 一次讀寫(xiě)一個(gè)字符串
fread和fwrite按快讀寫(xiě)文件
fscanf和sprintf格式化讀寫(xiě)文件
文件的隨機(jī)讀寫(xiě)API有哪些
rewind復(fù)位文件流指針
ftell返回文件流指針 距離文件首部的 字節(jié)數(shù)
fseek文件流指針定位