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)放棄再使用該指針。