如今的編譯器,壹個整數int類型的值占用32位bit,也就是4字節,編譯器將第壹個字節的編號定義為該整數的地址,由於保存地址的變量就像壹個箭頭指向某地址,而稱為指針變量。
int a =10; //定義壹個整數變量a,對其賦值10
int *p =&a;//定義壹個指針變量p,對其賦值a的內存地址,&符號意思為引用跟隨其後的變量地址。
cout <<a<<endl; //輸出 a的值:10
cout << p << endl ;// 輸出p的值:XXXXX 其實為a的地址,該地址由編譯器和運行時確定。
cout << *p <<endl; //輸出p指向的地址中的值:10,也就是a的值,*星號放在變量前面意思就是取該變量中的地址所指內存中的值。
讀取過程為:p的值(a的地址)->尋址->取值
由於指針是壹個變量的首個字節的地址,所以要告訴編譯器被指地址包含連續多少個字節,因此指針也有類型。比如上面例子中聲明了p指針是個整數指針,這樣編譯器知道p指向壹個4字節的內存塊。
妳可以將指針變量看做壹般的整數變量來理解,用來保存壹個整數(地址是個整數),只是,該整數代表著某地址,在這裏是a的地址。
在C/C++中很靈活,但是也很危險,也很難學,如果指針指向錯誤的地址會引起程序崩潰,因此在C#中已經被微軟封裝了,但內部還是有指針的。
如果有必要,C#中也可以使用指針,使用非安全代碼,在項目生成選項卡中勾選“允許非安全代碼”,然後就可以使用指針了,不過不建議這麽做。
unsafe
{
int a = 10;
int* p=&a;
}