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