指針和引用的區(qū)別:
主要是兩點(diǎn):
引用使用時(shí)必須非空即必須初始化為非空值,指針則初始化時(shí)可以為空;
引用初始化后不能更改為指向其它對(duì)象,指針可以。
void swap(int *p,int *q){
int *tmp;
*tmp=*p;
*p=*q;
*q=*tmp;
}
上面的代碼并不能完成*p和*q值的交換,原因在于*tmp并沒有分配內(nèi)存,導(dǎo)致后面執(zhí)行錯(cuò)誤(vs2012測(cè)試)。
class A{
private:
int m_a;
int m_b;
public:
A(){ m_a = 1;m_b=2; }
void fun(){ printf("%d %d", m_a,m_b); }
}
class B{
private:
int m_c;
public:
A(){ m_c = 3; }
void fun(){ printf("%d %d",m_c); }
}
void main(){
A a;
B *b=(*)(&a);
b->fun();
}
打印的結(jié)果為1。強(qiáng)制地將A類對(duì)象a的內(nèi)存按照類B的結(jié)構(gòu)讀取,結(jié)果b->c等于a->m_a,再調(diào)用b的方法打印。
如果子類中定義了一個(gè)與父類名相同的成員變量,則父類的該變量會(huì)隱藏。當(dāng)父類指針指向子類時(shí),則使用->該成員變量,則顯示的會(huì)是父類的成員變量。
若一個(gè)函數(shù)沒有return語句,則函數(shù)會(huì)隱式的返回0,而不是什么都不返回。
函數(shù)需要在它被調(diào)用之前聲明,若定義后再被調(diào)用則才能不用聲明。
const int* p; //指向const的指針,指針?biāo)傅膬?nèi)容是const int類型
int const* p; //同上,只是int 與 const的順序交換了,推薦上面那種寫法
int* const p; //指向int的const指針,指針的指向?yàn)閏onst,不能更改指向的地址
const int* const p; //指向const int的const指針
//指針函數(shù)是指返回值為指針的函數(shù),本質(zhì)是一個(gè)函數(shù),只是返回值為指針而已。
int* f(int x,int y ) //返回int類型指針的函數(shù)
//函數(shù)指針是指指向函數(shù)地址的指針,本質(zhì)是一個(gè)指針。
int *(f)(int x,int y) //返回值為int類型的,形參為兩個(gè)int的函數(shù)指針 f
int main(){
int max(int, int); //聲明max函數(shù)
int (*p)(int, int ); //聲明一個(gè)int f(int,int)類型的函數(shù)指針
p=&max; //為p賦值
}
一個(gè)指向整型數(shù)組的指針的定義 : int (*ptr)[].
可以這樣讀,先讀括號(hào)的,優(yōu)先級(jí)最高嘛,說明是個(gè)指針;然后看外面的int []是個(gè)int 型數(shù)組,所以合起來就是一個(gè)指向整型數(shù)組的指針。
迷途指針,也叫懸浮指針、失控指針。是當(dāng)對(duì)一個(gè)指針執(zhí)行delete操作后,釋放了它所指向的內(nèi)存,并且沒有置nullptr時(shí)產(chǎn)生的。如果后面沒有賦值再次使用時(shí),可能出現(xiàn)錯(cuò)誤。
malloc/free是C++/C的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運(yùn)算符。都用于申請(qǐng)動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。但是malloc/free僅能用于內(nèi)部數(shù)據(jù)類型,對(duì)于自定義的對(duì)象不能使用,因?yàn)椴荒軋?zhí)行構(gòu)造/析構(gòu)函數(shù)。
句柄是一個(gè)32位的uint,實(shí)際上是windows在內(nèi)存中維護(hù)的一個(gè)對(duì)象的地址列表的索引,即指針的指針。這是因?yàn)閣indows的內(nèi)存管理經(jīng)常會(huì)改變一個(gè)對(duì)象的地址,所以不能直接使用對(duì)象的地址訪問對(duì)象,而是通過句柄獲取對(duì)象的地址,在根據(jù)這個(gè)地址訪問對(duì)象。