1. 定義
《型別》* 《指標變數》;
型別決定了指向的記憶體空間的大小。
指標變數也是一種變數,有著自己的記憶體空間,該空間上儲存的是另乙個變數的記憶體空間。
可以使用typedef取別名來減少定義變數時的一些麻煩,如typedef int* pointer;
2. 操作
1)取位址
int* p; int x; p = &x;//p指向x的位址,p的型別是int*, &x的型別也是int*
2)間接訪問
對於一般的指標變數,訪問格式是:*《指標變數》
結構型別的指標變數,訪問格式是:(*《指標變數》).《結構成員》 或 《指標變數》->《結構成員》
3)賦值
任何型別的指標都能賦給void *型別的指標變數,而非void * 型別的指標變數只能接受同型別的賦值。
4)指標運算
乙個指標加上或減去乙個整型值:《資料型別》* 《指標變數》; int a; 《指標變數》+a;可以理解為陣列中下標的變化,
《指標變數》 = 《指標變數》+(a*sizeof(《資料型別》))
兩個同型別的指標相減:結果是整型值,對應的是儲存空間中元素的個數,可用於求陣列的大小。
5)指標的輸出
非char *型別的指標變數:cout3. 指向常量的指標變數
const 《型別》 *《指標變數》;
4. 指標與動態變數
動態變數是在程式執行時才產生,並在程式結束前消亡。動態變數跟區域性變數不同,在程式執行前編譯程式就知道了區域性變數的存在
建立:new 《型別名》;如:int *p; p=new int; *p=1;
new 《型別名》[《整型表示式1>]...[《整型表示式n>];如:int (*q)[20]; int n=5;q=new int[n][20];
void *malloc(unsigned int size);如:double *q; int n=2; q=(double *)malloc(sizeof(double)*n);
撤銷:因為動態變數不能自動消亡,需要顯示撤銷其記憶體空間。
delete 《指標變數》;如:int *p=new int; delete p;
delete 《指標變數》;如:int *p=new int[20]; delete p;
void free(void *p);如:int *p=(int *)malloc(sizeof(int)*6)
應用:動態陣列、鍊錶
5. 指標 vs 無符號整數
指標從形式上看屬於無符號數,但是指標可以關聯到程式實體(變數或函式),指標指向某個記憶體位址,無符號整數的某些運算不能實施在指標上(如乘法和除法就不能)。
6. new vs malloc
1)new 自動計算所需分配的空間大小,而malloc需要顯示指出。
2)new自動返回相應型別的指標,而malloc要做強制型別轉換。
3)new會呼叫相應物件類的建構函式,而malloc不會。
對於new 和 malloc,如果程式的堆區沒有足夠的空間可供分配,則產生bad_alloc異常(會返回空指標null)。
7. delete vs free
1)delete會呼叫析構函式,free不會。
2)delete或free乙個指標時,其實只是從編譯器釋放了這個位址的記憶體,但指標仍然指向該位址,此時的指標叫做懸浮指標,懸浮指標不為空指標,依據可以用來賦值或者和使用,所以會產生語義錯誤。(怎麼解決呢?在delete或free後將指標設定為null)。
3)如果沒有進行delete或free操作,就將指標指向別處,之前分配的記憶體空間就會一直存在但不能再被使用,也就是說造成了記憶體洩漏。
8. 函式指標
函式指標就是指向函式的指標。
定義格式:《返回型別》 (*《指標變數》)(《形式參數列》); 如:double (*fp)(int); double fun(int x); fp=&fun;
或 typedef 《返回型別》 (*《函式指標型別名》)(《形式參數列》); 《函式指標型別名》 《指標變數》; 如:typedef double (*fp)(int); fp fp;
使用:(*《指標變數》)(《形式參數列》); 如 (*fp)(10); 相當於 fun(10);
為什麼使用函式指標:可以實現多型,乙個函式指標指向不同的函式就可以實現不同的功能,可以結合設計模式理解。
可以向函式傳遞函式,如:int func(int (*fp)(int)){};
9. 指標與陣列
10. 多級指標
指標除了可以指向一般型別的變數外,還可以指向指標型別的變數。指標變數要初始化後才能使用。
如果乙個指標變數沒有初始化或者賦值,訪問它所指向的變數將會導致執行時刻的嚴重錯誤。
int x;
int *p;
int **q;
*p=1; //error, p未初始化,p指向的空間不知道是什麼
*q=&x; //error,q未初始化
q=&p; //ok
**q=2; //error, q指向的變數p未初始化
11. 指向常量的指標型別 vs 指標型別的常量
指向常量的指標型別:不能改變指向的內容。如:const int *p;
兩者結合:const int*const r;
詳談C 指標型別
操作c 中的指標,是一種編寫非託管中的一種技術。c 中指標型別可能是 儲存在棧 中的值型別,也可能是 儲存在堆 中的引用 型別。不過無論是什麼型別,基本格式都有乙個共同的要求就是必須都是支援非 託管的型別或者空型別。這裡順便提一句,非託管的型別編譯依賴系統型別庫,而託管的型別依賴clr中元 資料.在...
C語言指標型別
在c語言中,定義了乙個特殊的資料型別 指標型別。指標型別的變數是專門 用來儲存某個變數的記憶體位址。這樣,我們就可以從指標變數的值取得執行時確切的位址了。eg int a 4個位元組 2000 2001 2002 2003 int b 4個位元組 2004 2005 2006 2007 int a ...
c 指標型別轉換
關於強制型別轉換的問題,很多書都討論過,寫的最詳細的是c 之父的 c 的設計和演化 最好的解決方法就是不要使用c風格的強制型別轉換,而是使用標準c 的型別轉換符 static cast,dynamic cast。標準c 中有四個型別轉換符 static cast dynamic cast reint...