C++中關(guān)于指針的知識點
什么是指針
在C++中,每定義一個變量,系統(tǒng)就會給變量分配一塊內(nèi)存,內(nèi)存相當(dāng)于系統(tǒng)為存放變量開辟的房間,而且內(nèi)存是有地址的,可以把地址理解成為門牌號。指針就像是把鑰匙,能夠打開與之匹配的大門。所以通過指針,你能訪問與之相對應(yīng)的內(nèi)存空間,修改里面存放的數(shù)據(jù)。在C++中用*(星號)表示指針。
同時,*運(yùn)算符被稱為間接值或者解除引用(解引用)運(yùn)算符,它用與指針,可以得到該地址的內(nèi)存中存儲的值,*也是乘法符號,C++根據(jù)上下文來確定*的具體含義。
const修飾指針
1)常量指針:const 數(shù)據(jù)類型 *變量名
? ? ? ? ?含義:不能通過解引用的方法修改內(nèi)存地址中的值,用被指向的變量名可以改
2)指針常量:數(shù)據(jù)類型 *const 變量名(能改值,不能改指向)
? ? ? ? ?含義:指向的變量不可改變,但可以修改內(nèi)存地址中的值
3)常指針常量:const 數(shù)據(jù)類型 *const 變量名(值和指向都不能改)
? ? ? ? ?含義:指向的對象不能改變,也不能通過解引用的方法修改內(nèi)存地址中的值
什么是二級指針
1)用于存放指針變量的地址
2)二級指針的語法:數(shù)據(jù)類型 **指針名
3)應(yīng)用場景:在函數(shù)中,如果傳遞普通變量的地址,形參用指針;傳遞指針的地址,形參用二級指針。把普通變量的地址傳入函數(shù)后可以在函數(shù)中修改變量的值;把指針的地址傳入函數(shù)后可以在函數(shù)中修改指針的值。
什么是空指針
2)C和C++中用0或NULL都可以表示空指針,C++11中nullptr也可(建議這樣寫)
2)注意:如果對空指針解引用,程序會崩潰,所以一定要判空。在內(nèi)存釋放后,應(yīng)將指針指向空
什么是野指針
1)野指針就是指針指向的不是一個有效的地址,訪問野指針可能會造成程序崩潰
2)野指針出現(xiàn)情況: 指針在定義的時候,沒有進(jìn)行初始化,值不確定;若指針指向了動態(tài)分配的內(nèi)存,內(nèi)存被釋放以后,指針沒有置空,但指向的地址已經(jīng)失效;指針指向的變量已超越變量作用域(變量的內(nèi)存空間已被系統(tǒng)回收)
3)規(guī)避野指針的方法:指針在定義的時候,如果沒地方指,就初始化為nullptr;動態(tài)分配的內(nèi)存被釋放后,將其置為nullptr;函數(shù)不要返回局部變量的地址;使用智能指針
函數(shù)指針
1)使用步驟:1.聲明函數(shù)指針 2.讓函數(shù)指針指向函數(shù)的地址 3.通過函數(shù)指針調(diào)用函數(shù)聲明函數(shù)指針時,必須提供函數(shù)類型,函數(shù)類型是指函數(shù)的返回值和參數(shù)列表
2)語法:
? ? ? ? ? int func(int a,string b);
? ? ? ? ? int (*pfunc)(int,string);
? ? ? ? ? pfunc = func;
指針的算數(shù)
指針變量+1后,增加的量等于它指向的數(shù)據(jù)類型的字節(jié)數(shù)
this指針
1)每個成員函數(shù)(包括構(gòu)造函數(shù)和析構(gòu)函數(shù))都有一個this指針,可以用它訪問調(diào)用者對象的成員。
2)this指針存放了對象的地址,它被作為隱藏參數(shù)傳遞給了成員函數(shù),指向調(diào)用成員函數(shù)的對象(調(diào)用者對象)