新聞中心
在C++編程中使用指針能有速度快,節(jié)約內(nèi)存等優(yōu)點,是很多C++程序員的***。但指針是一把雙刃劍,用好了它,你就會發(fā)現(xiàn)指針有多么的方便,反之,你可能就頭疼了,往往會出現(xiàn)意想不到的問題。

創(chuàng)新互聯(lián)建站從2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站建設、做網(wǎng)站網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元莒南做網(wǎng)站,已為上家服務,為莒南各地企業(yè)和個人服務,聯(lián)系電話:18982081108
一.什么是指針:
其實指針就像是其它變量一樣,所不同的是一般的變量包含的是實際的真實的數(shù)據(jù),而指針只是一個指示器,它告訴程序在內(nèi)存的哪塊區(qū)域可以找到數(shù)據(jù)。
這是一個非常重要的概念,有很多程序和算法都是圍繞指針設計的,如鏈表、遍歷等。
指針是一個數(shù)據(jù)類型,本身也需要占用四個字節(jié)的存儲空間。所以用sizeof(void*)獲得的值為4。
二.指針的定義
看如下的例子:
- int *pNumber;
這樣就定義了int類型的指針。
指針變量名稱以p為首字符,這是程序員通常在定義指針時的一個習慣,以提高便程序的閱讀性,表示這是個指針。另外,雖然int* pNumber和int *pNumber是相同的,但是使用后一種的編程風格更好一些。比如:
- int *pNumber1,*pNumber2;
表示定義兩個指針,*號和變量靠近;反之,我們可能會定義成int* pNumber1,pNumber2,這將是一個錯誤的定義,pNumber2就不是指針了。
三.指針的優(yōu)點
a.為函數(shù)提供修改調(diào)用變元的手段;
b.支持C++動態(tài)分配子程序
c.可以改善某些子程序的效率
d.為動態(tài)數(shù)據(jù)結(jié)構(gòu)(如二叉樹、鏈表)提供支持
四、指針賦值及轉(zhuǎn)換:
a.同類型直接賦值,異類型要進行轉(zhuǎn)換。
b.強制轉(zhuǎn)換:可以把表達式結(jié)果硬性轉(zhuǎn)換為指定類型
c.char * p;(int *)p 把p強制轉(zhuǎn)換為int型,記住轉(zhuǎn)換過程中要注意兩個類型的大小,大轉(zhuǎn)小時可能會有數(shù)據(jù)丟失(如int到double)
d.涉及void *的:
c 中void *類型可賦值給任何類型的指針,反之亦然
c++ 中都需要強制轉(zhuǎn)換
void * 可看作無窮大能接納任何類型賦值,反之不行int * p =9;void * t= p(正確);p=t(錯誤)
e.不涉及void *的都要強制轉(zhuǎn)換
五.指針和數(shù)組
不帶下標的數(shù)組名返回數(shù)組的起始地址,即數(shù)組首元素的地址,所以對數(shù)組的訪問可有兩種方式:數(shù)組下標和指針算術(shù)。例如:
- char* pChar;
- char chs[100];
- pChar = chs;
這樣pChar就指向chs數(shù)組的首地址。
六.數(shù)組與引用
a.引用只是變量的別名,而不是指向變量的指針(區(qū)別于取址運算符"&")不占內(nèi)存空間,對變量引用的改變其相應的變量也會改變。
b.不能對引用使用指針間接運算符“*”進行復引用操作
c.引用必須在聲明時初始化 int &c = count;(c是count的別名)
七.指針空間的動態(tài)分配與回收
動態(tài)分配是指針的關鍵技術(shù)。它是用來在不必定義變量的情況下分配內(nèi)存和讓指針去指向它們。分配了內(nèi)存,別忘了回收。你動態(tài)地分配了一個內(nèi)存空間,可它絕不會被自動刪除。
也就是說,這塊內(nèi)存空間會一直存在,直到你告訴電腦你已經(jīng)使用完了??山Y(jié)果是,你并沒有告訴電腦你已不再需要這塊內(nèi)存空間了,所以它會繼續(xù)占據(jù)著內(nèi)存空間造成浪費,甚至你的程序運行完畢,其它程序運行時它還存在。當這樣的問題積累到一定程度,最終將導致系統(tǒng)崩潰。所以這是很重要的,在你用完它以后,請釋放它的空間。
八.實際使用指針時,容易出現(xiàn)的錯誤
筆者歸納出指針錯誤的原因有以下幾點(個人經(jīng)驗,歡迎大家補充):
1.指針未初始化。
指針的初始化,不是指指針的定義,而是指針變量存儲的數(shù)值是個無效的數(shù)值。比如定義float a;這個a會分配一個地址,但初始值是一個亂七八糟的數(shù)據(jù)。同樣,float *a;也會為a分配一個地址,初始值也是亂七八糟的數(shù)據(jù)。初始化可以將a = NULL,這樣在以后的程序中可以增加if(a == NULL)來判斷指針是否有效,否則不行?;蛘邽橹羔樂峙浠蛘咧付臻g。如
- float *a = new float;
- 或者
- float b;
- float *a = &b;
都可以為指針指向一塊內(nèi)存以實現(xiàn)初始化。
2.指針越界
指針越界是個比較難以捕捉的錯誤。如果測試不全面,不容易被發(fā)現(xiàn)。對于為指針分配的空間大小,程序員一定要時刻注意。
3.指向局部變量的指針
指針是記錄某塊內(nèi)存起始地址的變量,要使指針有效,則必須確保這塊內(nèi)存有效。用new分配的內(nèi)存空間,只要不delete,則一直有效。但是對于指向某個變量地址的指針,程序員必須清楚該變量的作用域。如果離開了變量的作用域,該變量的內(nèi)存空間就會被系統(tǒng)自動回收,再使用指針時,將會發(fā)生錯誤。這是程序中最容易出現(xiàn)的錯誤。
4.指針指向的轉(zhuǎn)移
有些初涉C++的程序員,常常會寫出這樣的程序:
- char *pChar = new char;
- char chs;
- pChar = &chs;
- delete pChar;
他們的目的是想將chs內(nèi)容傳遞給pChar指針指向的內(nèi)存。但這樣寫,將會使pChar先前指向的空間編程垃圾地址,因為地址無法再獲取了。俗稱野指針。將會導致內(nèi)存泄漏。而且,在調(diào)用delete pChar時,也會發(fā)生異常錯誤。因為不是new的空間是不能使用delete刪除的。因為pChar已經(jīng)轉(zhuǎn)到指向chs這個變量的地址了。
指針的藝術(shù)遠不止這些,留待我們的愛好者進行深入的探討。指針給我們的程序帶來了太多的方便,同樣,它也有很多難以控制的問題。如何更好的駕馭指針,可以說是C++程序員提高自己的一個手段。
『注』本文參考了博客網(wǎng)的C++入門筆記,綜合了筆者自己對指針的理解。
名稱欄目:詳細介紹C++中指針的使用
本文網(wǎng)址:http://m.5511xx.com/article/ccogcpj.html


咨詢
建站咨詢
