一、vs2010中開啟unsafe code 的方式
unsafe
然後再專案上點選滑鼠右鍵,選擇「屬性」,在「生成」選項卡中選中「允許不安全**」
struct(結構體),結構體中只能包括非託管型別。
操作符說明
*取值運算子
&取址運算子
->
通過指標處理結構體中的資料(獲取或賦值)
++與–
指標增、減操作
fixed
使用者暫時固定託管**中引用型別的位置。
stackallc
分配記憶體
例如分配記憶體
char* cptr = stackalloc至於釋放記憶體,我在msdn上搜尋了一下,c#並沒有提供釋放記憶體的函式。而msdn給的解釋是:分配的記憶體會在方法結束後自動釋放。char[26
];for (int i = 0; i < 26;i++)
for (int i = 0; i < 26;i++)
:",(int)&cptr[i],cptr[i]));
}
fixed的應用會在下面的類與指標中做說明。
定義指標
說明int* p
整形指標
int** p
指向整形指標的指標
char* c
指向字元的指標
int* arr
整形一維陣列指標
五、指標的使用
1.整形指標的使用
int i=102.結構體指標;int* iptr = &i; //
將i的位址賦值給iptr
console.writeline((int)&iptr); //
取iptr得位址
console.writeline(*iptr); //
取iptr指向的值
struct以上**輸出結構體的位址和值。我們在操作位址時,可以直接看到結構體的記憶體分配。location
unsafe
static
void main(string
args)
,lptr位址,lptr值
",(int)&location,(int)lptr,*lptr));
console.writeline(
string.format("
location.x的位址,location.x的值
",(int)&(lptr->x),lptr->x));
console.writeline(
string.format("
location.y的位址,location.y的值
", (int)&(lptr->y), lptr->y));
}
3.指標與引數
public4.類與指標static
unsafe
int* add(int* x,int*y)
int i = 2, j = 3
;console.writeline(*add(&i,&j));
class通過以上的方法,我們可以操作值型別,也可以獲得值型別的位址。但如何獲取類的記憶體位址?我們可以使用gchandle,來自system.runtime.interopservices命名空間。gchandle提供從非託管記憶體訪問託管物件的方法。如下:people
}people people = new
people();
people.age = 10
;fixed(int* ageptr=&people.age)
people.showage();
//11
object p = newpeople();
gchandle h =gchandle.alloc(p, gchandletype.pinned);
intptr addr =h.addrofpinnedobject();
console.writeline(addr.tostring());
h.free();
C 中指標使用小結
1 宣告指標 typename pointername 2 給指標賦值 對變數名用 運算子,來獲得被命名的記憶體的位址,new運算子返回未命名的記憶體的位址。3 對指標解除引用 對指標應用解除引用或間接運算子 來解除醫用 4 陣列名 陣列名被視為陣列第乙個元素的位址,但是陣列名為常量,不能修改它的值...
C 中指標的使用藝術
在c 程式設計中使用指標能有速度快,節約記憶體等優點,是很多c 程式設計師的最愛。但指標是一把雙刃劍,用好了它,你就會發現指標有多麼的方便,反之,你可能就頭疼了,往往會出現意想不到的問題。一 什麼是指標 其實指標就像是其它變數一樣,所不同的是一般的變數包含的是實際的真實的資料,而指標只是乙個指示器,...
c 中指標與引用的使用
先說結論 使用指標的情況 使用引用 它們的異同 相同點 不同點char pc 0 char rc pc 引用指向空值string s1 foo string s2 bar string rs s1 string ps s1 rs s2 rs仍引用s1,實際是把s2賦值給s1,所以s1現在的值是 ba...