指针的好处
轉載▼
| ? | ? |
其實指針就像是其它變量一樣,所不同的是一般的變量包含的是實際的真實的數據,而指針包含的是一個指向內存中某個位置的地址。
二、指針的定義
int *pNumber;
這樣就定義了int類型的指針。指針變量名稱以p為首字符,這是程序員通常在定義指針時的一個習慣,以提高便程序的閱讀性,表示這是個指針。另外,雖然int* pNumber和int *pNumber是相同的,但是使用后一種的編程風格更好一些。比如:
int *pNumber1,*pNumber2;表示定義兩個指針,*號和變量靠近;反之,我們可能會定義成int* pNumber1,pNumber2,這將是一個錯誤的定義,pNumber2就不是指針了。
三、指針的優點
a.為函數提供修改調用變元的靈活手段;
b.支持C 動態分配子程序
c.可以改善某些子程序的效率
>>在數據傳遞時,如果數據塊較大(比如說數據緩沖區或比較大的結構),這時就可以使用指針傳遞地址而不是實際數據,即提高傳輸速度,又節省大量內存。
d.為動態數據結構(如二叉樹、鏈表)提供支持
四、指針賦值及轉換:
a)同類型直接賦值,異類型要進行轉換。
b)強制轉換:可以把表達式結果硬性轉換為指定類型
c)char * p;(int *)p 把p強制轉換為int型,記住轉換過程中要注意兩個類型的大小,大轉小時可能會有數據丟失(如int到double)
d)涉及void *的:
c 中void *類型可賦值給任何類型的指針,反之亦然
c 中都需要強制轉換
void * 可看作無窮大能接納任何類型賦值,反之不行int * p =9;void * t= p(正確);p=t(錯誤)
e)不涉及void *的都要強制轉換
五、指針和數組
不帶下標的數組名返回數組的起始地址,即數組首元素的地址,所以對數組的訪問可有兩種方式:數組下標和指針算術。例如:
char* pChar;
char chs[100];
pChar = chs;這樣pChar就指向chs數組的首地址。
六、數組與引用
a.引用只是變量的別名,而不是指向變量的指針(區別于取址運算符"&")不占內存空間,對變量引用的改變其相應的變量也會改變。
b.不能對引用使用指針間接運算符“*”進行復引用操作
c.引用必須在聲明時初始化 int &c = count;(c是count的別名)
七、指針空間的動態分配與回收
動態分配是指針的關鍵技術。它是用來在不必定義變量的情況下分配內存和讓指針去指向它們。分配了內存,別忘了回收。你動態地分配了一個內存空間,可它絕不會被自動刪除。也就是說,這塊內存空間會一直存在,直到你告訴電腦你已經使用完了。可結果是,你并沒有告訴電腦你已不再需要這塊內存空間了,所以它會繼續占據著內存空間造成浪費,甚至你的程序運行完畢,其它程序運行時它還存在。當這樣的問題積累到一定程度,最終將導致系統崩潰。所以這是很重要的,在你用完它以后,請釋放它的空間。
八、實際使用指針時,容易出現的錯誤
1.指針未初始化。
指針的初始化,不是指指針的定義,而是指針變量存儲的數值是個無效的數值。比如定義float a;這個a會分配一個地址,但初始值是一個亂七八糟的數據。同樣,float *a;也會為a分配一個地址,初始值也是亂七八糟的數據。初始化可以將a = NULL,這樣在以后的程序中可以增加if(a == NULL)來判斷指針是否有效,否則不行。或者為指針分配或者指定空間。如 float *a = new float;或者float b; float *a = &b;都可以為指針指向一塊內存以實現初始化。
2.指針越界
指針越界是個比較難以捕捉的錯誤。如果測試不全面,不容易被發現。對于為指針分配的空間大小,程序員一定要時刻注意。
3.指向局部變量的指針
指針是記錄某塊內存起始地址的變量,要使指針有效,則必須確保這塊內存有效。用new分配的內存空間,只要不delete,則一直有效。但是對于指向某個變量地址的指針,程序員必須清楚該變量的作用域。如果離開了變量的作用域,該變量的內存空間就會被系統自動回收,再使用指針時,將會發生錯誤。這是程序中最容易出現的錯誤。
4.指針指向的轉移
有些初涉C 的程序員,常常會寫出這樣的程序:
char *pChar = new char;
char chs;
pChar = &chs;
delete pChar;
他們的目的是想將chs內容傳遞給pChar指針指向的內存。但這樣寫,將會使pChar先前指向的空間編程垃圾地址,因為地址無法再獲取了。俗稱野指針。將會導致內存泄漏。而且,在調用delete pChar時,也會發生異常錯誤。因為不是new的空間是不能使用delete刪除的。因為pChar已經轉到指向chs這個變量的地址了。
char *p=(char*)malloc(1);//為指針p分配一塊內存
free(p);//釋放p所指向的內存
free(p);//error,因為p所指向的內存已經釋放掉,再次釋放原來的內存區域將會引起錯誤操作
p=0;//將0賦給指針p
free(p);
free(p);//ok,對一個空指針,可以多次釋放
總結
- 上一篇: 遭银行账号诈骗最快最有效自救法
- 下一篇: 网站性能优化的三重境界