定義和聲明區別:
(1)定義分配記憶體,聲明沒有
(2)定義只能出現一次,而聲明可以出現多次
(3)extern char a[] 與extern char a[100]等價,因為這裡只是聲明,不分配空間
(4)extern int a
extern 告訴編譯器a這個名字已經在別的檔案定義了,下面的代碼使用的名字a是別的檔案定義的
數組名的值:
(1)在絕大多數運算式中,數組名的值是指向數組第1個元素的指標。這個規則只有兩個例外:sizeof返回整個數組所佔用的位元組而不是一個指標所佔用位元組;單目操作符&返回一個指向數組的指標,而不是一個指向數組第1個元素的指標的指標
高手寫code的慣用法:
(1)將變數寫到右邊
例如: #define IDYES 6
int temp;
if(IDYES==temp)
{
//doing something
}
if(IDYES==temp) 較if(temp==IDYES)要好,因為當“==”誤寫成“=”時, if(IDYES=temp) 是編譯通不過的,容易檢查出來
(2)即使if只有一行code,也用使用{}
if(condition)
{
//doing something
}
兩點小知識:
(1)判斷輸入字元的是否為合法整數:先將字元轉換整數,再轉換字元,比較轉換前後字元,若相同,則是數字
(2)怎麼將jpg圖片格式快速轉化為bmp圖片格式:利用windows內建的畫圖工具轉換——選中要轉換的圖片,右擊,點編輯,在彈出的對話方塊中,點“檔案”,“另存新檔”,在檔案類型選擇24位位元影像即可
引用和指標:
(1)指標可以為空白,但是引用不可為空
(2)指標可以被賦值,但是引用只可以被初始化
(3)引用不可以被賦為另一個對象的別名,即另一個對象的引用
(4)如果想使一個變數記錄不同對象的地址,那麼就必須使用指標
(5)在堆中建立一塊記憶體地區,必須要用指標來指向它,否則該地區就會變成無法方向的記憶體空間。當然我們也可以使用引用來引用指向記憶體空間的指標
(6)指標可以指向堆中空間,引用不可以指向堆中空間
(7)引用就是別名 int &mun=num; //&是引用運算子
(8)不能定義類的別名,但可以定義對象的別名
(9)引用就是常量,只能初始化,不能賦值
(10)Null 參考:指標進行刪除操作後,需要將它們賦為空白指標,引用卻不需要這麼做,這是因為引用是原來對象的別名,假設該對象存放在棧中,那麼在對象超出範圍時別名會各對象一起消失。假如該對象存放在堆中,由於堆中記憶體空間必須使用指標來訪問,因此用不著別名,即使定義一個該指標的別名,那麼將指標刪除並賦空後,該指標的別名中的地址也相應的賦空了
(11)this指標:
<1>this變數綮每一個對象的記憶體位址,然後通過間接訪問運算子 -> 訪問該對象的成員
<2>this變數記錄每一個單獨對象的記憶體位址,而this指標則指向每個單獨的對象。因此不同的對象輸出的this變數的記憶體位址也不同
<3>this指標的建立與刪除由編譯器來完成
引用容易犯的錯誤:
(1)引用是對象的別名,假如這個對象不存在了,使用這個對象的別名就會出現錯誤
(2)解構函式調用並析構某個對象後,只是告訴編譯器這一塊記憶體不再為某一個對象獨佔了,你可以訪問它,別的對象或者變數也可以訪問它並使用該記憶體地區儲存它們的資料,但是在它們使用之前,存放在該記憶體地區的資料並沒有刪除
(3)只要在堆中建立一塊記憶體空間,就會返回一個指向該空間的指標,我們一定不要弄丟該指標,假如該指標丟失,那麼訪堆中空間就會成為一塊不可方向的地區,也就是程式員們經常說的記憶體流失。同樣假如我們將儲存在堆中的對象初始化給一個引用,那麼當訪對象被刪除時,這個引用也就成了Null 參考,假如我們無意中使用了這個Null 參考的話,就會令程式出錯
(4)在哪裡建立,就在哪裡釋放
棧和堆:
(1)棧由於是系統自動分配,因此速度較快。但是缺點是可存放的空間較小,只在2M。假如我們要存放比較大的資料,棧顯然是不行的,那麼就得用堆了。堆是一大堆不連續的記憶體地區,在系統中由鏈表將它們串接起來,因此它可存放的空間可以很大。
(2)關於它們在執行效率以及申請方式上的區別,這裡有兩點基礎不同:
<1>棧由系統自動分配記憶體,堆要程式員進行申請
<2>棧中空間比較小,只有2M,堆的上限是由系統中有效虛擬記憶體來定的,因此獲得空間比較大
(3)對象在堆與棧中的不同:
<1>一個儲存在棧中的對象,如:Human Jack;在超出範圍時,比如說遇到右大括弧,自動調用解構函式來釋放該對象的所佔用的記憶體
<2>一個儲存在堆中的對象,如new Human;則需要要程式員自行對其所佔用的記憶體進行釋放,否則該對象所佔用的記憶體直到程式結束才會被系統回收
(4)棧(stack)由編譯器自動分配並且釋放,一般存放函數的參數值,局部變數值等
(5)堆(heap)一般由程式員分配釋放,若程式員不釋放,程式結束時可能由作業系統回收
指標的常犯錯誤:
(1)刪除一個指標後一定要將該指標設定為空白指標,這是因為刪除該指標只會釋放它所指向的記憶體空間,而不會刪除指標,因此這個指標還存在,並且它仍然會指向原來的記憶體空間,因此這時如果你再次嘗試使用訪指標,將會導致程式出錯
(2)常量指標:
<1>int *const p;p=&a;(錯誤); int *const p=&a;(正確) 常用指標必須初始化
<2>常量指標的特性:常量指標自身不可以改變,但是它指向的目標卻可以改變,無論目標是變數還是對象
(3)指向常量的指標: const int *p;
相關文章:
• C/C++ 一點筆記(1)
• C/C++ 一點筆記(2)