常見字符
?*
- 注釋:/* 這是一個注釋*/
- 乘法:a * b
- 取值運算符:*指針變量,int a = 4,*a ?????
- 指針變量:數據類型 *變量名, int *no = &bh,代表了no是一個指針
- 數據類型:int*:整型指針類型、char* 字符指針類型,char* c=(char *) &b。int no=38,int* ptr=&no, &no和ptr是一個東西,no和*ptr是一個東西。
- 間接值/解除引用/解引用運算符:
注:int *no 和 int* no什么區別
?1. 實際上沒有區別
?2. int* a, b; 這里 a 是指向 int 的指針,而 b 只是一個普通的 int 整數變量。
?3. int *a, *b; 這樣的聲明清晰地表明 a 和 b 都是指向 int 的指針。
::
- 變量屬于哪個域:std::count<<"no"
- 當局部變量和全局變量名稱相同時,會屏蔽全局變量使用局部變量,如果想使用全局變量,使用::,:: a。
常見關鍵詞?
typedef
數據類型的別名
static(靜態)
靜態局部變量
- ?主要作用:會影響變量的存儲期和作用域。
- 只會被初始化一次
- 靜態局部變量:static修飾的局部變量生命周期和程序相同。即在函數調用結束后不會被銷毀,而是保持其值直到下次調用。
- 靜態類成員:用 static 聲明的類成員屬于整個類,而不是類的各個實例。
const(常量)
- 主要作用:增強程序的安全性
- 初始化之后,值不能被修改
- 當 const 修飾類的成員函數時,表示該函數不會修改類的任何成員變量
指針
- ?常量指針:const 數據類型 *變量名;不能通過解引用的方法修改內存地址中的值(用原始的變量名是可以修改的)。
-
Int a=3,b=4;
const int* p=&a; #報錯
*p = 13; p=&b; #不報錯
-
- 指針常量
- 數據類型 * const 變量名;
- 指向的變量(對象)不可改變。
- 在定義的同時必須初始化,否則沒有意義。
- 可以通過解引用的方法修改內存地址中的值。
-
Int a=3,b=4;
const int* p=&a; #不報錯
*p = 13; p=&b; #報錯
-
新名字:引用
-
常指針常量
-
const 數據類型 * const 變量名;
-
指向的變量(對象)不可改變,不能通過解引用的方法修改內存地址中的值。
-
新名字:常引用。?
-
常量指針:指針指向可以改,指針指向的值不可以更改。
指針常量:指針指向不可以改,指針指向的值可以更改。
常指針常量:指針指向不可以改,指針指向的值不可以更改。
記憶秘訣:*表示指針,指針在前先讀指針;指針在前指針就不允許改變。
常量指針:const 數據類型 *變量名
指針常量:數據類型 * const 變量名
-
?void
- 函數的返回值用void,表示函數沒有返回值。
- 函數的參數填void,表示函數不需要參數(或者讓參數列表空著)。
- 函數的形參用void *,表示接受任意數據類型的指針。
- 注意:
- 不能用void聲明變量,它不能代表一個真實的變量,但是,用void *可以。
- 不能對void *指針直接解引用(需要轉換成其它類型的指針)。
- 把其它類型的指針賦值給void*指針不需要轉換。
- 把void *指針賦值給把其它類型的指針需要轉換。
內存
內存分為內核空間和用戶空間,內核空間由操作系統管理,與程序員沒什么關系。我們寫的程序運行在用戶空間。一個c++源程序編譯成可執行程序后,二進制文件的大小是固定的,最多幾十兆。
程序運行時,內存主要分成四個區,分別是棧、堆、數據段和代碼段。
棧:存儲局部變量、函數參數和返回值。不管計算機的內存是8G還是16G,分配給棧的只有幾兆。修改系統參數可以調整棧的大小。
堆:存儲動態開辟內存的變量。內存越大,分配的內存就越大。
n數據段:存儲全局變量和靜態變量。
代碼段:存儲可執行程序的代碼和常量(例如字符常量),此存儲區不可修改。
棧和堆的主要區別:
1)管理方式不同:棧是系統自動管理的,在出作用域時,將自動被釋放;堆需手動釋放,若程序中不釋放,程序結束時由操作系統回收。
2)空間大小不同:堆內存的大小受限于物理內存空間;而棧就小得可憐,一般只有8M(可以修改系統參數)。
3)分配方式不同:堆是動態分配;棧有靜態分配和動態分配(都是自動釋放)。
4)分配效率不同:棧是系統提供的數據結構,計算機在底層提供了對棧的支持,進棧和出棧有專門的指令,效率比較高;堆是由C++函數庫提供的。
棧的效率非常高,堆是用鏈表來管理的,效率會低一點。
5)是否產生碎片:對于棧來說,進棧和出棧都有著嚴格的順序(先進后出),不會產生碎片;而堆頻繁的分配和釋放,會造成內存空間的不連續,容易產生碎片,太多的碎片會導致性能的下降。
6)增長方向不同:棧向下增長,以降序分配內存地址;堆向上增長,以升序分配內存地址。
動態分配內存new
????????申請內存的語法:new 數據類型(初始值); // C++11支持{}
????????如果動態分配的內存不用了,必須用delete釋放它,否則有可能用盡系統的內存。
for (int ii = 1; ii > 0; ii++){int* p = new int[100000]; // 一次申請100000個整數。cout << "ii="<<ii<<",p=" << p << endl;}
內存會螺旋式越來越大,(一會大一會小,是因為系統有交換區)
靜態分配內存
空指針
- 用0或NULL都可以表示空指針。int* p=0,表示還沒有指向任何地址。
- 如果對空指針使用delete運算符,系統將忽略該操作,不會出現異常。
-
用0和NULL表示空指針會產生歧義,C++11建議用nullptr表示空指針,也就是(void *)0。