Q:指針是什么?
A:指針本身不存儲數據,存儲的是數據存放的地址
? ? ? 一個變量的地址稱為該變量的“指針”,存放該地址的變量稱為指針變量。
指針必須得初始化,沒有初始化的指針指向的是未知的內存地址,可能造成程序報錯。所以我們需要對指針賦初值,對指針賦予空值我們常用NULL。
Q:NULL與nullptr有什么區別?為什么要提出nullptr?
A:NULL在C++里就是宏定義,實質就是0.
? ? ? 那這里就存在一個問題,當存在重載函數fun(char *)和fun(int),我們想要調用的是fun(char *),使用fun(NULL)會發現調用的是fun(int)。
? ? ? 為了解決這個問題,Cli加入了nullptr關鍵字,nullptr可以轉換成任何指針類型和bool類型(為了兼容不同指針可以用if(ptr)判斷指針是否為空),但是不能轉換成int類型
Q:三種傳遞方式分別是什么?
A:值傳遞:形參是實參在棧中的拷貝,形參是實參的副本。從被調用函數來看,值傳遞是單向的(實參—>形參),即參數值只能傳入。(效率低下)
? ? ? 指針傳遞:形參是指向實參地址的指針,改變形參指向地址的值同樣也會改變實參的值。
? ? ? 引用傳遞:形參相當于實參的“別名”,形參在棧。中開辟了空間,保存的是實參的地址。被調函數對形參進行的任何操作都被認為是間接尋址。所以會影響實參的值。
Q:返回指針的函數可以返回值傳遞的形參的地址嗎?
A:不能。此時形參的地址為新的內存地址而不是實參的地址,且在調用函數調用完畢后形參就被銷毀,那么地址就不在作用域內(形參在此時相當于是局部變量)。
Q:那么如何從函數中返回局部變量的地址呢?
A;1.使用靜態變量或全局變量代替局部變量
? ? ? 2.使用動態內存分配
Q:什么是常量指針?什么是指針常量?
A:指向常量的指針是常量指針 const int *a=&b;
在聲明指針變量語句的變量名前加上const關鍵字,則該指針變量就變為一個常量。int *const a=&b;
Q:常量指針與指針常量之間的區別?
A:常量指針可以修改指針的指向對象,不能修改指向對象的值。????
? ? ? 指針常量可以修改指向對象的內容。
動態分配
Q:什么是動態內存分配?
A:動態內存分配就是從堆內存中分配存儲空間。new運算符可以從堆空間中分配內存,并且返回分配空間的地址。
Q:為什么動態內存分配可能會造成內存泄露?
A:沒有及時使用delete釋放內存空間,指針變量隨后指向其他內存地址,那么就將無法釋放這塊內存地址,這就叫做內存泄露。
Q:什么叫垃圾回收機制?
A:不需要delete釋放內存,CLR會自動維護內存,當不需要使用CLR分配的堆內存空間時,CLR會自動釋放內存
const void print(const int num)const
理解一下上面的概念,第一個const修飾返回類型 第二個const修飾參數 第三個const修飾調用對象
思考一下free之后的指針為空嗎?
free之后的指針仍然指向原來的堆地址,即仍然可以繼續使用,但很危險。因為操作系統已經認為這塊內存可以使用,它會毫不考慮的將他分配給其他程序,于是你下次不小心使用到該指針(野指針)時,如果操作系統及時制止了這種行為,報錯(非法操作),然后將你的程序殺掉,給你很容易改正錯誤的機會,這還算比較好的結果!如果操作系統沒有制止這種行為,那么產生的后果可就說不準了,說不定整個操作系統會崩潰,那么你再來改正這個錯誤,就不容易發現咯!所以,最好free了以后再置空,即令指針?= NULL;,表示?本程序已經放棄再使用該指針。