首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 不安全代碼深度解析(二):固定/移動變數、指標轉換與指標陣列

     編輯:關於C#

固定變數與移動變數

& 與 fixed 將變數分為兩類:

  • 固定變數:永久存在,不受 GC 影響(區域變數、值參數、間接指標指向的變數)
  • 移動變數:可能被 GC 重新定位或釋放(物件欄位、陣列元素、靜態欄位、ref/out 參數)

固定變數可直接取址;移動變數必須在 fixed 區塊中取址,位址僅在區塊內有效。

指標轉換規則

隱式轉換

  • 任意指標型別 → void*
  • null → 任意指標型別

顯式轉換(其餘皆需強制)

  • 指標型別間相互轉換
  • 整數型別(sbyte, byte, short, ushort, int, uint, long, ulong)⇄ 指標型別

轉換不改變位址值,但若結果指標未正確對齊,解引用行為未定義。

範例:檢視 double 位元模式

unsafe static void Main() {
    double d = 123.456e23;
    byte* pb = (byte*)&d;
    for (int i = 0; i < sizeof(double); i++)
        Console.Write("{0:X2} ", *pb++);
    Console.WriteLine();
}

輸出取決於系統端序。

指標陣列

允許指標陣列,但限制:

  • 可隱式轉為 System.Array,但透過它存取元素會拋運行時錯誤(指標不可轉 object)
  • 不可轉為 IList<T>(指標不可作型別參數)
  • foreach 會被編譯器重寫為多維索引迴圈,不支援指標陣列

指標運算與存取

程式碼範例

// 結構指標存取
struct Point { public int x, y; }
Point pt; Point* p = &pt;
p->x = 10; p->y = 20; // 或 (*p).x = 10;

// 指標陣列初始化
char* buf = stackalloc char[256];
for (int i = 0; i < 256; i++) buf[i] = (char)i;
// 等價於 *(buf + i) = (char)i;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
運算說明
*p間接存取(解引用),void* 禁止
p->Member等同 (*p).Member,結構成員存取
p[index]等同 *(p + index),元素存取
++/--指標算術,按型別大小移動
+/-指標與整數加減
== != < > <= >=指標比較
stackalloc堆疊配置記憶體
fixed暫時固定移動變數