標籤:style blog http color 使用 資料
using System;using System.Collections.Generic;using System.Text;namespace HelloWorld{ class Program { static void Main(string[] args) { // 1.指標的定義 // 1.1指標是專門處理地址的資料類型 // 1.2指標是某個記憶體單元的首地址 // 2.C#指標的和C,C++的區別(這裡我們需要知道兩個關鍵字 unsafe 和 fixed) // 2.1指標在c#中是不提倡使用的,有關指標的操作被認為是不安全的(unsafe)。因此運行這段代碼之前,先要改一個地方,否則編譯不過無法運行。 // 修改方法: // 在右側的solution Explorer中找到你的項目,在項目表徵圖(綠色)上點右鍵,選最後一項properties,然後在Build標籤頁裡把Allow unsafe code勾選上。之後這段代碼就可以運行了,你會看到,上面這段代碼可以像C語言那樣用指標操縱數組。但前提是必須有fixed (int* p = array),它的意思是讓p固定指向數組array,不允許改動。因為C#的自動記憶體回收機制會允許已經分配的記憶體在運行時進行位置調整,如果那樣,p可能一開始指的是array,但後來array的位置被調整到別的位置後,p指向的就不是array了。所以要加一個fixed關鍵字,把它定在那裡一動不動,之後的操作才有保障。 //**********************下面直接看代碼:********************* //1.1 int類型指標(實值型別) //C#操作指標的時候必須放在unsafe代碼塊下 unsafe { //聲明一個int變數 值為10; int i = 10; //聲明一個指標變數 int* intp; //將指標指向變數i intp = &i; Console.WriteLine("變數I的值為:{0}", i); Console.WriteLine("變數I的記憶體位址為:{0:X}", (int)intp); Console.WriteLine("指標intp的記憶體位址為:{0:X}", (int)&intp); Console.WriteLine("指標intp的值為:{0}", *intp); } //1.2 string類型(參考型別) unsafe { //聲明一個字串為 hello world!(string類型就是一個char的數組) string _str = "hello world!"; //上文已經說過,C#中因為有gc的原因會把放在託管椎中的記憶體進行位置調整fixed的作用就是讓其固定. fixed (char* strp = _str) { Console.WriteLine("變數_str的值為:{0}", _str); Console.WriteLine("變數_str的地址為:{0}", (int)strp); Console.WriteLine("指標strp的值為{0}", *strp); //提示錯誤, 無法取得唯讀局部變數的地址 , 因為strp是唯讀.編譯器不讓strp改變改指標.所以編譯不通過 //Console.WriteLine("指標strp的地址為:{0}", (int)&strp); //迴圈輸出字串 char* chp = strp; for (int i = 0; chp[i] != ‘\0‘; //字串結束符號是 ‘\0‘ i++) { Console.Write(chp[i]); } Console.WriteLine(); Console.WriteLine("指標strp的地址:{0:x}", (int)chp); Console.WriteLine("指標chp的地址:{0:x}", (int)&chp); } } //1.3數組 unsafe { //聲明一個數組 int[] arrInt = { 1, 2, 3, 4, 5, 6, 7, 87, 8 }; fixed (int* ip = arrInt) { //迴圈輸出數組 int* p = ip; for (int i = 0; i < arrInt.Length; i++) { Console.Write(p[i] + " "); } } } Console.ReadKey(); } }}
輸出結果: