C++指針與引用詳解

Q:指針是什么?

A:指針本身不存儲(chǔ)數(shù)據(jù),存儲(chǔ)的是數(shù)據(jù)存放的地址

? ? ? 一個(gè)變量的地址稱為該變量的“指針”,存放該地址的變量稱為指針變量

指針必須得初始化,沒有初始化的指針指向的是未知的內(nèi)存地址,可能造成程序報(bào)錯(cuò)。所以我們需要對(duì)指針賦初值,對(duì)指針賦予空值我們常用NULL。

Q:NULL與nullptr有什么區(qū)別?為什么要提出nullptr?

A:NULL在C++里就是宏定義,實(shí)質(zhì)就是0.

? ? ? 那這里就存在一個(gè)問題,當(dāng)存在重載函數(shù)fun(char *)和fun(int),我們想要調(diào)用的是fun(char *),使用fun(NULL)會(huì)發(fā)現(xiàn)調(diào)用的是fun(int)。

? ? ? 為了解決這個(gè)問題,Cli加入了nullptr關(guān)鍵字,nullptr可以轉(zhuǎn)換成任何指針類型和bool類型(為了兼容不同指針可以用if(ptr)判斷指針是否為空),但是不能轉(zhuǎn)換成int類型

Q:三種傳遞方式分別是什么?

A:值傳遞:形參是實(shí)參在棧中的拷貝,形參是實(shí)參的副本。從被調(diào)用函數(shù)來看,值傳遞是單向的(實(shí)參—>形參),即參數(shù)值只能傳入。(效率低下)

? ? ? 指針傳遞:形參是指向?qū)崊⒌刂返闹羔?,改變形參指向地址的值同樣也?huì)改變實(shí)參的值。

? ? ? 引用傳遞:形參相當(dāng)于實(shí)參的“別名”,形參在棧。中開辟了空間,保存的是實(shí)參的地址。被調(diào)函數(shù)對(duì)形參進(jìn)行的任何操作都被認(rèn)為是間接尋址。所以會(huì)影響實(shí)參的值。

Q:返回指針的函數(shù)可以返回值傳遞的形參的地址嗎?

A:不能。此時(shí)形參的地址為新的內(nèi)存地址而不是實(shí)參的地址,且在調(diào)用函數(shù)調(diào)用完畢后形參就被銷毀,那么地址就不在作用域內(nèi)(形參在此時(shí)相當(dāng)于是局部變量)。

Q:那么如何從函數(shù)中返回局部變量的地址呢?

A;1.使用靜態(tài)變量或全局變量代替局部變量

? ? ? 2.使用動(dòng)態(tài)內(nèi)存分配

Q:什么是常量指針?什么是指針常量?

A:指向常量的指針是常量指針 const int *a=&b;

在聲明指針變量語句的變量名前加上const關(guān)鍵字,則該指針變量就變?yōu)橐粋€(gè)常量。int *const a=&b;

Q:常量指針與指針常量之間的區(qū)別?

A:常量指針可以修改指針的指向?qū)ο?,不能修改指向?qū)ο蟮闹怠????

? ? ? 指針常量可以修改指向?qū)ο蟮膬?nèi)容。


動(dòng)態(tài)分配

Q:什么是動(dòng)態(tài)內(nèi)存分配?

A:動(dòng)態(tài)內(nèi)存分配就是從堆內(nèi)存中分配存儲(chǔ)空間。new運(yùn)算符可以從堆空間中分配內(nèi)存,并且返回分配空間的地址。

Q:為什么動(dòng)態(tài)內(nèi)存分配可能會(huì)造成內(nèi)存泄露?

A:沒有及時(shí)使用delete釋放內(nèi)存空間,指針變量隨后指向其他內(nèi)存地址,那么就將無法釋放這塊內(nèi)存地址,這就叫做內(nèi)存泄露。

Q:什么叫垃圾回收機(jī)制?

A:不需要delete釋放內(nèi)存,CLR會(huì)自動(dòng)維護(hù)內(nèi)存,當(dāng)不需要使用CLR分配的堆內(nèi)存空間時(shí),CLR會(huì)自動(dòng)釋放內(nèi)存


const void print(const int num)const

理解一下上面的概念,第一個(gè)const修飾返回類型 第二個(gè)const修飾參數(shù) 第三個(gè)const修飾調(diào)用對(duì)象


思考一下free之后的指針為空嗎?

free之后的指針仍然指向原來的堆地址,即仍然可以繼續(xù)使用,但很危險(xiǎn)。因?yàn)椴僮飨到y(tǒng)已經(jīng)認(rèn)為這塊內(nèi)存可以使用,它會(huì)毫不考慮的將他分配給其他程序,于是你下次不小心使用到該指針(野指針)時(shí),如果操作系統(tǒng)及時(shí)制止了這種行為,報(bào)錯(cuò)(非法操作),然后將你的程序殺掉,給你很容易改正錯(cuò)誤的機(jī)會(huì),這還算比較好的結(jié)果!如果操作系統(tǒng)沒有制止這種行為,那么產(chǎn)生的后果可就說不準(zhǔn)了,說不定整個(gè)操作系統(tǒng)會(huì)崩潰,那么你再來改正這個(gè)錯(cuò)誤,就不容易發(fā)現(xiàn)咯!所以,最好free了以后再置空,即令指針?= NULL;,表示?本程序已經(jīng)放棄再使用該指針。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容