C++指針與引用詳解

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;,表示?本程序已經放棄再使用該指針。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容