Q:指針是什么郎仆?
A:指針本身不存儲數(shù)據(jù)塌鸯,存儲的是數(shù)據(jù)存放的地址
? ? ? 一個變量的地址稱為該變量的“指針”炕婶,存放該地址的變量稱為指針變量姐赡。
指針必須得初始化,沒有初始化的指針指向的是未知的內(nèi)存地址柠掂,可能造成程序報錯项滑。所以我們需要對指針賦初值,對指針賦予空值我們常用NULL涯贞。
Q:NULL與nullptr有什么區(qū)別枪狂?為什么要提出nullptr危喉?
A:NULL在C++里就是宏定義,實質(zhì)就是0.
? ? ? 那這里就存在一個問題州疾,當(dāng)存在重載函數(shù)fun(char *)和fun(int)辜限,我們想要調(diào)用的是fun(char *),使用fun(NULL)會發(fā)現(xiàn)調(diào)用的是fun(int)严蓖。
? ? ? 為了解決這個問題薄嫡,Cli加入了nullptr關(guān)鍵字,nullptr可以轉(zhuǎn)換成任何指針類型和bool類型(為了兼容不同指針可以用if(ptr)判斷指針是否為空)颗胡,但是不能轉(zhuǎn)換成int類型
Q:三種傳遞方式分別是什么毫深?
A:值傳遞:形參是實參在棧中的拷貝,形參是實參的副本毒姨。從被調(diào)用函數(shù)來看哑蔫,值傳遞是單向的(實參—>形參),即參數(shù)值只能傳入弧呐。(效率低下)
? ? ? 指針傳遞:形參是指向?qū)崊⒌刂返闹羔樥⒚裕淖冃螀⒅赶虻刂返闹低瑯右矔淖儗崊⒌闹怠?/p>
? ? ? 引用傳遞:形參相當(dāng)于實參的“別名”,形參在棧泉懦。中開辟了空間稿黍,保存的是實參的地址。被調(diào)函數(shù)對形參進行的任何操作都被認(rèn)為是間接尋址崩哩。所以會影響實參的值。
Q:返回指針的函數(shù)可以返回值傳遞的形參的地址嗎言沐?
A:不能邓嘹。此時形參的地址為新的內(nèi)存地址而不是實參的地址,且在調(diào)用函數(shù)調(diào)用完畢后形參就被銷毀险胰,那么地址就不在作用域內(nèi)(形參在此時相當(dāng)于是局部變量)汹押。
Q:那么如何從函數(shù)中返回局部變量的地址呢?
A起便;1.使用靜態(tài)變量或全局變量代替局部變量
? ? ? 2.使用動態(tài)內(nèi)存分配
Q:什么是常量指針棚贾?什么是指針常量?
A:指向常量的指針是常量指針 const int *a=&b;
在聲明指針變量語句的變量名前加上const關(guān)鍵字榆综,則該指針變量就變?yōu)橐粋€常量妙痹。int *const a=&b;
Q:常量指針與指針常量之間的區(qū)別?
A:常量指針可以修改指針的指向?qū)ο蟊谴荒苄薷闹赶驅(qū)ο蟮闹怠????
? ? ? 指針常量可以修改指向?qū)ο蟮膬?nèi)容怯伊。
動態(tài)分配
Q:什么是動態(tài)內(nèi)存分配?
A:動態(tài)內(nèi)存分配就是從堆內(nèi)存中分配存儲空間判沟。new運算符可以從堆空間中分配內(nèi)存耿芹,并且返回分配空間的地址崭篡。
Q:為什么動態(tài)內(nèi)存分配可能會造成內(nèi)存泄露?
A:沒有及時使用delete釋放內(nèi)存空間吧秕,指針變量隨后指向其他內(nèi)存地址琉闪,那么就將無法釋放這塊內(nèi)存地址,這就叫做內(nèi)存泄露砸彬。
Q:什么叫垃圾回收機制颠毙?
A:不需要delete釋放內(nèi)存,CLR會自動維護內(nèi)存拿霉,當(dāng)不需要使用CLR分配的堆內(nèi)存空間時吟秩,CLR會自動釋放內(nèi)存
const void print(const int num)const
理解一下上面的概念,第一個const修飾返回類型 第二個const修飾參數(shù) 第三個const修飾調(diào)用對象
思考一下free之后的指針為空嗎绽淘?
free之后的指針仍然指向原來的堆地址涵防,即仍然可以繼續(xù)使用,但很危險沪铭。因為操作系統(tǒng)已經(jīng)認(rèn)為這塊內(nèi)存可以使用壮池,它會毫不考慮的將他分配給其他程序,于是你下次不小心使用到該指針(野指針)時杀怠,如果操作系統(tǒng)及時制止了這種行為椰憋,報錯(非法操作),然后將你的程序殺掉赔退,給你很容易改正錯誤的機會橙依,這還算比較好的結(jié)果!如果操作系統(tǒng)沒有制止這種行為硕旗,那么產(chǎn)生的后果可就說不準(zhǔn)了窗骑,說不定整個操作系統(tǒng)會崩潰,那么你再來改正這個錯誤漆枚,就不容易發(fā)現(xiàn)咯创译!所以,最好free了以后再置空墙基,即令指針?= NULL;软族,表示?本程序已經(jīng)放棄再使用該指針。