所有變數值儲存在記憶體中,而每個記憶體都有一個地址,所謂地址就是一個整數編號,如同門牌號碼用於定位(專業術語叫定址),一個地址對應一個位元組(8bit)的記憶體單元。
如今的編譯器,一個整數int型別的值佔用32位bit,也就是4位元組,編譯器將第一個位元組的編號定義為該整數的地址,由於儲存地址的變數就像一個箭頭指向某地址,而稱為指標變數。
int a =10; //定義一個整數變數a,對其賦值10
int *p =&a;//定義一個指標變數p,對其賦值a的記憶體地址,&符號意思為引用跟隨其後的變數地址。
cont <<a<<end; //輸出 a的值:10
cont << p << end ;// 輸出p的值:XXXXX 其實為a的地址,該地址由編譯器和執行時確定。
cont << *p <<end; //輸出p指向的地址中的值:10,也就是a的值,*星號放在變數前面意思就是取該變數中的地址所指記憶體中的值。
讀取過程為:p的值(a的地址)->定址->取值
由於指標是一個變數的首個位元組的地址,所以要告訴編譯器被指地址包含連續多少個位元組,因此指標也有型別。比如上面例子中聲明瞭p指標是個整數指標,這樣編譯器知道p指向一個4位元組的記憶體塊。
你可以將指標變數看做一般的整數變數來理解,用來儲存一個整數(地址是個整數),只是,該整數代表著某地址,在這裡是a的地址。
在C/C++中很靈活,但是也很危險,也很難學,如果指標指向錯誤的地址會引起程式崩潰,因此在C#中已經被微軟封裝了,但內部還是有指標的。
如果有必要,C#中也可以使用指標,使用非安全程式碼,在專案生成選項卡中勾選“允許非安全程式碼”,然後就可以使用指標了,不過不建議這麼做。
unsafe
{
int a = 10;
int* p=&a;
}
所有變數值儲存在記憶體中,而每個記憶體都有一個地址,所謂地址就是一個整數編號,如同門牌號碼用於定位(專業術語叫定址),一個地址對應一個位元組(8bit)的記憶體單元。
如今的編譯器,一個整數int型別的值佔用32位bit,也就是4位元組,編譯器將第一個位元組的編號定義為該整數的地址,由於儲存地址的變數就像一個箭頭指向某地址,而稱為指標變數。
int a =10; //定義一個整數變數a,對其賦值10
int *p =&a;//定義一個指標變數p,對其賦值a的記憶體地址,&符號意思為引用跟隨其後的變數地址。
cont <<a<<end; //輸出 a的值:10
cont << p << end ;// 輸出p的值:XXXXX 其實為a的地址,該地址由編譯器和執行時確定。
cont << *p <<end; //輸出p指向的地址中的值:10,也就是a的值,*星號放在變數前面意思就是取該變數中的地址所指記憶體中的值。
讀取過程為:p的值(a的地址)->定址->取值
由於指標是一個變數的首個位元組的地址,所以要告訴編譯器被指地址包含連續多少個位元組,因此指標也有型別。比如上面例子中聲明瞭p指標是個整數指標,這樣編譯器知道p指向一個4位元組的記憶體塊。
你可以將指標變數看做一般的整數變數來理解,用來儲存一個整數(地址是個整數),只是,該整數代表著某地址,在這裡是a的地址。
在C/C++中很靈活,但是也很危險,也很難學,如果指標指向錯誤的地址會引起程式崩潰,因此在C#中已經被微軟封裝了,但內部還是有指標的。
如果有必要,C#中也可以使用指標,使用非安全程式碼,在專案生成選項卡中勾選“允許非安全程式碼”,然後就可以使用指標了,不過不建議這麼做。
unsafe
{
int a = 10;
int* p=&a;
}