Debug和Release版本比較
- Debug附加了許多調試信息,主要用于調試,故文件大;
- Release是經過優化后的版本,去掉了調試信息,代碼進行了優化,故文件較小,且編譯速度快過Debug,用于發布平臺的配置管理器的設置;
32位與64位
- 32位,地址為32位,最大使用內存4G,只能運行32位的數據;
- 64位,地址為64位,既可以運行32位的數據,也可以運行64位的數據;
指針
- 指針是個量,對應一塊內存區域;
- 指針存儲的是某個內存單元的地址;
- 訪問方式:
- 1、直接訪問:按變量地址存取變量值,取地址符&;
- 2、間接訪問:通過存放變量地址的變量去訪問變量,間接運算符*;
- 在函數中改變一個外部變量,需要變量的地址;
- 若是數據,需要指向數據的指針存儲數據的地址;
- 若是指針,需要指向指針的指針存用戶指針的地址;
數組與指針
- p[i]等價于*(p+i),&p[i]等價于p+i;
- a[i][j]等價于*(*(a+i)+j),&a[i][j]等價于*(a+i)+j, a[i]等價于*(a+i);
- 行數組指針定義方法:數據類型(*指針變量名)[二維數組列數];
- 二維數組地址不可變化,數據可以變化,可以在不修改地址的情況下管理數據,指針數組指向的數據不可變化,但地址可以變化,在不修改數據的情況下查看數據;
- 三維數組與指針,A[i][j][k]的三種表達形式:*(A[i][j]+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;創作不易,未經同意,轉載請注明出處~