C語言知識點總結篇

Debug和Release版本比較

  • Debug附加了許多調試信息,主要用於調試,故文件大;
  • Release是通過優化後的版本,去掉了調試信息,代碼進行了優化,故文件較小,且編譯速度快過Debug,用於發佈平臺的配置管理器的設置;

32位與64位

  • 32位,地址爲32位,最大使用內存4G,只能運行32位的數據;
  • 64位,地址爲64位,既能夠運行32位的數據,也能夠運行64位的數據;

指針

  • 指針是個量,對應一塊內存區域;
  • 指針存儲的是某個內存單元的地址;
  • 訪問方式:
    一、直接訪問:按變量地址存取變量值,取地址符&;
    二、間接訪問:經過存放變量地址的變量去訪問變量,間接運算符*;
  • 在函數中改變一個外部變量,須要變量的地址;
  • 如果數據,須要指向數據的指針存儲數據的地址;
  • 如果指針,須要指向指針的指針存用戶指針的地址;

數組與指針

  • p[i]等價於*(p+i),&p[i]等價於p+i;
  • ai等價於*(*(a+i)+j),&ai等價於*(a+i)+j, a[i]等價於*(a+i);
  • 行數組指針定義方法:數據類型(*指針變量名)[二維數組列數];
  • 二維數組地址不可變化,數據能夠變化,能夠在不修改地址的狀況下管理數據,指針數組指向的數據不可變化,但地址能夠變化,在不修改數據的狀況下查看數據;
  • 三維數組與指針,Ai[k]的三種表達形式:*(Ai+k)、*(*(A[i]+j)+k)、*(*(*(A+i)+j)+k);

函數與指針

  • 若在程序中定義了一個函數,在編譯時,編譯系統爲函數代碼分配一段存儲空間,這段存儲空間的起始地址,稱爲這個函數的指針,int(*p)(int, int),表明定義p是指向函數的指針變量,能夠指向類型爲整形且有兩個整形參數的函數;
  • 定義返回值爲指針值的函數的通常形式:類型名 *函數名(參數列表);

malloc和free函數

  • 動態內存分配,沒法知道內存具體位置時,想要綁定真正的內存空間,則要用到動態分配內存,原型爲extern void* malloc(unsigned int size),空指針能夠轉換爲任何類型的指針,size僅僅是申請字節的大小,並無論申請的內存塊中存儲的數據類型,故申請內存的長度需經過「長度 x sizeof(類型)」的方式給出,使用完以後要用free釋放內存;
  • 一個類型的指針包含三個信息:地址、步長、內容如何解析;
  • 在棧區開闢一段內存,系統會本身回收,在堆區開闢一段內存,須要手動用free釋放;

calloc和realloc函數

  • calloc原型:void* calloc(unsigned int num,unsigned int size),num:對象個數,size:對象佔據的內存字節數,功能是爲已經分配的內存從新分配空間並複製內容,會自動將內存初始化爲0;
  • realloc原型:voidrealloc(void ptr,unsigned int size),ptr:已分配的內存地址,size:從新分配的字節數

內存分區

  • C/C++中,內存分爲:堆、棧、自由存儲區、全局/靜態存儲區、常量存儲區;
  • 堆:由new分配的內存塊,通常對應一個delete,若沒用釋放,則程序結束後操做系統自動回收;
  • 棧:編譯器須要的時候分配,不須要時自動清楚的變量的存儲區,一般是局部變量、函數參數等;
  • 自由存儲區:由malloc等分配的內存塊,必須用free釋放;
  • 全局存儲區:全局變量和靜態變量的存儲區域,未初始化的二者在相鄰存的另外一塊區域,程序結束後自動釋放;
  • 常量存儲區:存放常量,不可修改;

sizeof和strlen

  • 實例
#include <iostream>
#include <string.h>

int main()
{
    char str[10] = "hello";
    cout << sizeof(str) <<endl << sizeof("hello")<< endl << str(str)<< endl;

    system("pause");
    return 0;
}
  • 結果:

  • 結論:對一個數組字符串,sizeof無論是否初始化,只輸出其預留內存大小,而strlen()輸出初始化後的字符串所佔內存大小,不含'0';

gets和scanf

  • gets遇到換行符表示結束,而scanf遇到空格、製表符、換行則表示結束;

Unicode字符問題

  • char字符串可顯示漢字,但字符不能夠,字符連在一塊兒用%c%c能夠輸出一個漢字;

結構體

  • 結構體引用方式:結構體數組名[下標].成員名;
  • 結構體指針變量引用成員形式:(*結構體指針名).成員名、結構體指針名->成員名、結構體變量名.成員名;

結構體字節對齊機制

  • 結構體變量大小是可以被其最寬基本類型成員的大小所整除;
  • 結構體每一個成員相對於結構體首地址的偏移量都是成員大小的整數倍,如有須要編譯器會在成員之間加上填充字節;
  • 結構體總大小爲結構體最寬基本類型成員大小的整數倍,如有須要編譯器會在最末一個成員以後加上填充字節;

共同體union

  • 使幾個不一樣類型的變量共佔一段內存(相互覆蓋),長度=最長成員所佔字節數,不能同時對全部成員初始化;

深拷貝與淺拷貝

  • 深拷貝:根據指針指向的值,從新申請內存,再以此將指針指向內容複製過來,有相互獨立的內存空間,通常複製構造函數和strcpy等函數都是深拷貝;
  • 淺拷貝:把對象(結構)裏的值徹底複製給另外一個對象(結構),對於地址也是照抄,類的默認複製構造函數是將類中非靜態成員變量逐個複製,是淺拷貝;

文件分類

按邏輯
  • 記錄文件:具備必定結構的記錄組成(定長和不定長);
  • 流式文件:由一個個字符(字節)數據順序組成;
按存儲介質
  • 普通文件:存儲介質文件(磁盤、磁帶等);
  • 設備文件:非存儲介質(鍵盤、顯示器、打印機等);
按數據組織形式
  • 文本文件:ASXII文件,每一個字節存放一個字符的ASCII碼;
  • 二進制文件:數據按其在內存中的存儲形式原樣存放;

文件處理方法

  • 緩衝文件系統:高級文件系統,系統自動爲正在使用的文件開闢內存緩衝區和非緩衝文件系統;
  • 低級文件系統:由用戶在程序中爲每一個文件設定緩衝區;

fscanf和fprintf函數

  • 二者遇到空格或換行時結束;

文件型結構體

struct _iobuf
 {
char *_ptr;//當前緩衝區內容指針
int   _cnt;//緩衝區還有多少個字符
char *_base;//緩衝區的起始地址
int   _flag;//文件流的狀態,是否錯誤或者結束
int   _file;//文件描述符
int   _charbuf;//雙字節緩衝,緩衝2個字節
int   _bufsiz;//緩衝區大小
char *_tmpfname;//臨時文件名
};

fopen打開模式

  • 只讀模式"r"打開文件,該文件必須存在,不然打開失敗,r+,rb,rb+,rt,rt+模式打開文件,文件不存在也會失敗;
  • 只寫模式"w"打開,文件存在則長度清0,不存在則創建文件,w+,wb,wb+,wt,wt+模式打開文件,文件不存在則創建文件;
  • a以附加的方式打開只寫文件,若文件不存在,則創建文件,存在則在文件尾部添加數據,a+以附加的方式打開可讀寫文件,不存在則創建文件,存在則寫入數據到文件尾,at二進制數據的追加,不存在則建立,只能寫、at+讀寫打開一個文本文件,容許讀或在文本末追加數據,ab二進制數據的追加,不存在則建立,只能寫;

阻塞模式和非阻塞模式

  • 非阻塞模式,會引發宕機,會一直執行;
system("start notepad");
  • 阻塞模式,不會引發宕機,執行一步後才能執行下一步;
system("notepad");
歡迎關注微信公衆號: 村雨1943;創做不易,未經贊成,轉載請註明出處~
相關文章
相關標籤/搜索