<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FC_Sharp%2FLanguage_Basics%2FPointer_Unsafe</id>
		<title>Csharp/C Sharp/Language Basics/Pointer Unsafe - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://nfex.ru/index.php?action=history&amp;feed=atom&amp;title=Csharp%2FC_Sharp%2FLanguage_Basics%2FPointer_Unsafe"/>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/Pointer_Unsafe&amp;action=history"/>
		<updated>2026-04-29T17:58:42Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/Pointer_Unsafe&amp;diff=740&amp;oldid=prev</id>
		<title> в 15:31, 26 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/Pointer_Unsafe&amp;diff=740&amp;oldid=prev"/>
				<updated>2010-05-26T15:31:18Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 15:31, 26 мая 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
			</entry>

	<entry>
		<id>http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/Pointer_Unsafe&amp;diff=741&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://nfex.ru/index.php?title=Csharp/C_Sharp/Language_Basics/Pointer_Unsafe&amp;diff=741&amp;oldid=prev"/>
				<updated>2010-05-26T11:39:43Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==An array name with an index yields a pointer to the     start of the array==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/* An array name with an index yields a pointer to the &lt;br /&gt;
   start of the array. */ &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
public class PtrArray { &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
    int[] nums = new int[10]; &lt;br /&gt;
 &lt;br /&gt;
    fixed(int* p = &amp;amp;nums[0], p2 = nums) { &lt;br /&gt;
      if(p == p2) &lt;br /&gt;
        Console.WriteLine(&amp;quot;p and p2 point to same address.&amp;quot;); &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Demonstrate fixed==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Demonstrate fixed. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
class Test { &lt;br /&gt;
  public int num; &lt;br /&gt;
  public Test(int i) { num = i; } &lt;br /&gt;
} &lt;br /&gt;
 &lt;br /&gt;
public class FixedCode { &lt;br /&gt;
  // mark Main as unsafe &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
    Test o = new Test(19); &lt;br /&gt;
 &lt;br /&gt;
    fixed (int* p = &amp;amp;o.num) { // use fixed to put address of o.num into p &lt;br /&gt;
 &lt;br /&gt;
      Console.WriteLine(&amp;quot;Initial value of o.num is &amp;quot; + *p); &lt;br /&gt;
   &lt;br /&gt;
      *p = 10; // assign the to count via p &lt;br /&gt;
     &lt;br /&gt;
      Console.WriteLine(&amp;quot;New value of o.num is &amp;quot; + *p); &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Demonstrate pointer comparison==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Demonstrate pointer comparison. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
public class PtrCompDemo { &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
 &lt;br /&gt;
    int[] nums = new int[11]; &lt;br /&gt;
    int x; &lt;br /&gt;
 &lt;br /&gt;
    // find the middle &lt;br /&gt;
    fixed (int* start = &amp;amp;nums[0]) {  &lt;br /&gt;
      fixed(int* end = &amp;amp;nums[nums.Length-1]) {  &lt;br /&gt;
        for(x=0; start+x &amp;lt;= end-x; x++) ; &lt;br /&gt;
      } &lt;br /&gt;
    } &lt;br /&gt;
    Console.WriteLine(&amp;quot;Middle element is &amp;quot; + x); &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Demonstrate pointers and unsafe==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Demonstrate pointers and unsafe. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
public class UnsafeCode { &lt;br /&gt;
  // mark Main as unsafe &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
    int count = 99; &lt;br /&gt;
    int* p; // create an int pointer &lt;br /&gt;
 &lt;br /&gt;
    p = &amp;amp;count; // put address of count into p &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(&amp;quot;Initial value of count is &amp;quot; + *p); &lt;br /&gt;
 &lt;br /&gt;
    *p = 10; // assign the to count via p &lt;br /&gt;
     &lt;br /&gt;
    Console.WriteLine(&amp;quot;New value of count is &amp;quot; + *p); &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Demonstrate the effects of pointer arithmethic==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Demonstrate the effects of pointer arithmethic. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
public class PtrArithDemo { &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
    int x; &lt;br /&gt;
    int i;  &lt;br /&gt;
    double d; &lt;br /&gt;
 &lt;br /&gt;
    int* ip = &amp;amp;i; &lt;br /&gt;
    double* fp = &amp;amp;d; &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(&amp;quot;int     double\n&amp;quot;); &lt;br /&gt;
 &lt;br /&gt;
    for(x=0; x &amp;lt; 10; x++) { &lt;br /&gt;
       Console.WriteLine((uint) (ip) + &amp;quot; &amp;quot; + &lt;br /&gt;
                         (uint) (fp)); &lt;br /&gt;
       ip++; &lt;br /&gt;
       fp++; &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Index a pointer as if it were an array==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Index a pointer as if it were an array. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
public class PtrIndexDemo { &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
    int[] nums = new int[10]; &lt;br /&gt;
 &lt;br /&gt;
    // index pointer &lt;br /&gt;
    Console.WriteLine(&amp;quot;Index pointer like array.&amp;quot;); &lt;br /&gt;
    fixed (int* p = nums) { &lt;br /&gt;
      for(int i=0; i &amp;lt; 10; i++)  &lt;br /&gt;
        p[i] = i; // index pointer like array &lt;br /&gt;
 &lt;br /&gt;
      for(int i=0; i &amp;lt; 10; i++)  &lt;br /&gt;
        Console.WriteLine(&amp;quot;p[{0}]: {1} &amp;quot;, i, p[i]); &lt;br /&gt;
    } &lt;br /&gt;
 &lt;br /&gt;
    // use pointer arithmetic &lt;br /&gt;
    Console.WriteLine(&amp;quot;\nUse pointer arithmetic.&amp;quot;); &lt;br /&gt;
    fixed (int* p = nums) { &lt;br /&gt;
      for(int i=0; i &amp;lt; 10; i++)  &lt;br /&gt;
        *(p+i) = i; // use pointer arithmetic &lt;br /&gt;
 &lt;br /&gt;
      for(int i=0; i &amp;lt; 10; i++)  &lt;br /&gt;
        Console.WriteLine(&amp;quot;*(p+{0}): {1} &amp;quot;, i, *(p+i)); &lt;br /&gt;
    } &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Multiple Indirect==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
public class MultipleIndirect { &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
    int x;    // holds a int value  &lt;br /&gt;
    int* p;  // holds an int pointer &lt;br /&gt;
    int** q; // holds an pointer to an int pointer &lt;br /&gt;
 &lt;br /&gt;
    x = 10; &lt;br /&gt;
    p = &amp;amp;x; // put address of x into p &lt;br /&gt;
    q = &amp;amp;p; // put address of p into q &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(**q); // display the value of x  &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Pointers and Declarative Pinning==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 31 - Interop\Calling Native DLL Functions\Pointers and Declarative Pinning&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
// file=ReadFileUnsafe.cs&lt;br /&gt;
// compile with: csc /unsafe ReadFileUnsafe.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Runtime.InteropServices;&lt;br /&gt;
using System.Text;&lt;br /&gt;
class FileRead&lt;br /&gt;
{&lt;br /&gt;
    const uint GENERIC_READ = 0x80000000;&lt;br /&gt;
    const uint OPEN_EXISTING = 3;&lt;br /&gt;
    int handle;&lt;br /&gt;
    &lt;br /&gt;
    public FileRead(string filename)&lt;br /&gt;
    {&lt;br /&gt;
        // opens the existing file&lt;br /&gt;
        handle = CreateFile(    filename,&lt;br /&gt;
        GENERIC_READ,&lt;br /&gt;
        0, &lt;br /&gt;
        0,&lt;br /&gt;
        OPEN_EXISTING,&lt;br /&gt;
        0,&lt;br /&gt;
        0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    [DllImport(&amp;quot;kernel32&amp;quot;, SetLastError=true)]&lt;br /&gt;
    static extern int CreateFile(&lt;br /&gt;
    string filename,&lt;br /&gt;
    uint desiredAccess,&lt;br /&gt;
    uint shareMode,&lt;br /&gt;
    uint attributes,        // really SecurityAttributes pointer&lt;br /&gt;
    uint creationDisposition,&lt;br /&gt;
    uint flagsAndAttributes,&lt;br /&gt;
    uint templateFile);&lt;br /&gt;
    &lt;br /&gt;
    [DllImport(&amp;quot;kernel32&amp;quot;, SetLastError=true)]&lt;br /&gt;
    static extern unsafe bool ReadFile(&lt;br /&gt;
    int hFile,&lt;br /&gt;
    void* lpBuffer, &lt;br /&gt;
    int nBytesToRead,&lt;br /&gt;
    int* nBytesRead,&lt;br /&gt;
    int overlapped);&lt;br /&gt;
    &lt;br /&gt;
    public unsafe int Read(byte[] buffer, int count)&lt;br /&gt;
    {&lt;br /&gt;
        int n = 0;&lt;br /&gt;
        fixed (byte* p = buffer) &lt;br /&gt;
        {&lt;br /&gt;
            ReadFile(handle, p, count, &amp;amp;n, 0);&lt;br /&gt;
        }&lt;br /&gt;
        return n;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
public class PointersandDeclarativePinning&lt;br /&gt;
{&lt;br /&gt;
    public static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
        FileRead fr = new FileRead(args[0]);&lt;br /&gt;
        &lt;br /&gt;
        byte[] buffer = new byte[128];&lt;br /&gt;
        ASCIIEncoding e = new ASCIIEncoding();&lt;br /&gt;
        &lt;br /&gt;
        // loop through, read until done&lt;br /&gt;
        Console.WriteLine(&amp;quot;Contents&amp;quot;);&lt;br /&gt;
        while (fr.Read(buffer, 128) != 0)&lt;br /&gt;
        {&lt;br /&gt;
            Console.Write(&amp;quot;{0}&amp;quot;, e.GetString(buffer));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==References and Pointers==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 * C# Programmers Pocket Consultant&lt;br /&gt;
 * Author: Gregory S. MacBeth&lt;br /&gt;
 * Email: gmacbeth@comporium.net&lt;br /&gt;
 * Create Date: June 27, 2003&lt;br /&gt;
 * Last Modified Date:&lt;br /&gt;
 */&lt;br /&gt;
using System;&lt;br /&gt;
using System.Runtime.InteropServices;&lt;br /&gt;
namespace Client.Chapter_7___References__Pointers_and_Memory_Management&lt;br /&gt;
{&lt;br /&gt;
  public class ReferencesandPointers&lt;br /&gt;
  {&lt;br /&gt;
    static void Main(string[] args)&lt;br /&gt;
    {&lt;br /&gt;
      UsePointers();&lt;br /&gt;
    }&lt;br /&gt;
    static unsafe public void UsePointers()&lt;br /&gt;
    {&lt;br /&gt;
      char * pMyArray = (char*)Marshal.AllocCoTaskMem(6);&lt;br /&gt;
      while (*pMyArray != &amp;quot;\0&amp;quot;)&lt;br /&gt;
      {&lt;br /&gt;
        Console.WriteLine(*pMyArray);&lt;br /&gt;
        pMyArray++;&lt;br /&gt;
      }&lt;br /&gt;
      Marshal.FreeCoTaskMem((IntPtr)pMyArray);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unsafe code: copy==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C# Programming Tips &amp;amp; Techniques&lt;br /&gt;
by Charles Wright, Kris Jamsa&lt;br /&gt;
Publisher: Osborne/McGraw-Hill (December 28, 2001)&lt;br /&gt;
ISBN: 0072193794&lt;br /&gt;
*/&lt;br /&gt;
namespace nsType&lt;br /&gt;
{&lt;br /&gt;
    using System;&lt;br /&gt;
    &lt;br /&gt;
    public class IntCopy&lt;br /&gt;
    {&lt;br /&gt;
        public static void Main ()&lt;br /&gt;
        {&lt;br /&gt;
            int [] arr1 = new int[] {1, 4, 2, 8, 5, 7};&lt;br /&gt;
            int [] arr2 = new int[arr1.Length];&lt;br /&gt;
            MemCpy (arr2, arr1, arr1.Length);&lt;br /&gt;
            arr1[0] = 142857;&lt;br /&gt;
            for (int x = 0; x &amp;lt; arr1.Length; ++x)&lt;br /&gt;
            {&lt;br /&gt;
                Console.Write (&amp;quot;arr1[{0}] = {1}\t&amp;quot;, x, arr1[x]);&lt;br /&gt;
                Console.Write (&amp;quot;arr2[{0}] = {1}\n&amp;quot;, x, arr2[x]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        static unsafe public void MemCpy (int [] dst, int [] src, int size)&lt;br /&gt;
        {&lt;br /&gt;
            if ((size &amp;gt; dst.Length) || (size &amp;gt; src.Length))&lt;br /&gt;
            {&lt;br /&gt;
                ArgumentException e = new ArgumentException(&amp;quot;The size argument is too large for one of the array arguments&amp;quot;);&lt;br /&gt;
                throw (e);&lt;br /&gt;
            }&lt;br /&gt;
            fixed (int *Src = src, Dst = dst)&lt;br /&gt;
            {&lt;br /&gt;
                int* pSrc = Src;&lt;br /&gt;
                int* pDst = Dst;&lt;br /&gt;
                for (int n = 0; n &amp;lt; size; ++n)&lt;br /&gt;
                {&lt;br /&gt;
                    *pDst++ = *pSrc++;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Unsafe Context==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
A Programmer&amp;quot;s Introduction to C# (Second Edition)&lt;br /&gt;
by Eric Gunnerson&lt;br /&gt;
Publisher: Apress  L.P.&lt;br /&gt;
ISBN: 1-893115-62-3&lt;br /&gt;
*/&lt;br /&gt;
// 36 - Deeper into C#\Unsafe Context&lt;br /&gt;
// copyright 2000 Eric Gunnerson&lt;br /&gt;
// file=unsafe.cs&lt;br /&gt;
// compile with: csc /unsafe /o+ unsafe.cs&lt;br /&gt;
using System;&lt;br /&gt;
using System.Diagnostics;&lt;br /&gt;
using System.Runtime.InteropServices;&lt;br /&gt;
&lt;br /&gt;
public class UnsafeContext&lt;br /&gt;
{&lt;br /&gt;
    const int iterations = 20000;    // # to do copy&lt;br /&gt;
    const int points = 1000;        // # of points in array&lt;br /&gt;
    const int retryCount = 5;        // # of times to retry&lt;br /&gt;
    &lt;br /&gt;
    public delegate Point[] CloneFunction(Point[] a);&lt;br /&gt;
    &lt;br /&gt;
    public static void TimeFunction(Point[] arr, &lt;br /&gt;
    CloneFunction func, string label)&lt;br /&gt;
    {&lt;br /&gt;
        Point[]    arrCopy = null;&lt;br /&gt;
        long start;&lt;br /&gt;
        long delta;&lt;br /&gt;
        double min = 5000.0d;    // big number;&lt;br /&gt;
        &lt;br /&gt;
        // do the whole copy retryCount times, find fastest time&lt;br /&gt;
        for (int retry = 0; retry &amp;lt; retryCount; retry++)&lt;br /&gt;
        {&lt;br /&gt;
            start = Counter.Value;&lt;br /&gt;
            for (int iterate = 0; iterate &amp;lt; iterations; iterate++)&lt;br /&gt;
            arrCopy = func(arr);&lt;br /&gt;
            delta = Counter.Value - start;&lt;br /&gt;
            double result = (double) delta / Counter.Frequency;&lt;br /&gt;
            if (result &amp;lt; min)&lt;br /&gt;
            min = result;&lt;br /&gt;
        }&lt;br /&gt;
    Console.WriteLine(&amp;quot;{0}: {1:F3} seconds&amp;quot;, label, min);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public static void Main()&lt;br /&gt;
    {&lt;br /&gt;
        Console.WriteLine(&amp;quot;Points, Iterations: {0} {1}&amp;quot;, points, iterations);&lt;br /&gt;
        Point[] arr = new Point[points];&lt;br /&gt;
        for (int index = 0; index &amp;lt; points; index++)&lt;br /&gt;
        arr[index] = new Point(3, 5);&lt;br /&gt;
        &lt;br /&gt;
        TimeFunction(arr, &lt;br /&gt;
        new CloneFunction(Point.ClonePointArrayMemcpy), &amp;quot;Memcpy&amp;quot;);&lt;br /&gt;
        TimeFunction(arr, &lt;br /&gt;
        new CloneFunction(Point.ClonePointArrayUnsafe), &amp;quot;Unsafe&amp;quot;);&lt;br /&gt;
        TimeFunction(arr, &lt;br /&gt;
        new CloneFunction(Point.ClonePointArray), &amp;quot;Baseline&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
class Counter &lt;br /&gt;
{&lt;br /&gt;
    public static long Frequency &lt;br /&gt;
    {&lt;br /&gt;
        get &lt;br /&gt;
        {&lt;br /&gt;
            long freq = 0;&lt;br /&gt;
            QueryPerformanceFrequency(ref freq);&lt;br /&gt;
            return freq;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    public static long Value &lt;br /&gt;
    {&lt;br /&gt;
        get &lt;br /&gt;
        {&lt;br /&gt;
            long count = 0;&lt;br /&gt;
            QueryPerformanceCounter(ref count);&lt;br /&gt;
            return count;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    [System.Runtime.InteropServices.DllImport(&amp;quot;KERNEL32&amp;quot;,&lt;br /&gt;
    CharSet=System.Runtime.InteropServices.CharSet.Auto)]&lt;br /&gt;
    private static extern bool QueryPerformanceCounter(  ref long lpPerformanceCount);&lt;br /&gt;
    &lt;br /&gt;
    [System.Runtime.InteropServices.DllImport(&amp;quot;KERNEL32&amp;quot;, &lt;br /&gt;
    CharSet=System.Runtime.InteropServices.CharSet.Auto)]&lt;br /&gt;
    private static extern bool QueryPerformanceFrequency( ref long lpFrequency);                     &lt;br /&gt;
}&lt;br /&gt;
public struct Point&lt;br /&gt;
{&lt;br /&gt;
    public Point(int x, int y)&lt;br /&gt;
    {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // safe version&lt;br /&gt;
    public static Point[] ClonePointArray(Point[] a)&lt;br /&gt;
    {&lt;br /&gt;
        Point[] ret = new Point[a.Length];&lt;br /&gt;
        &lt;br /&gt;
        for (int index = 0; index &amp;lt; a.Length; index++)&lt;br /&gt;
        ret[index] = a[index];&lt;br /&gt;
        &lt;br /&gt;
        return(ret);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // unsafe version using pointer arithmetic&lt;br /&gt;
    unsafe public static Point[] ClonePointArrayUnsafe(Point[] a)&lt;br /&gt;
    {&lt;br /&gt;
        Point[] ret = new Point[a.Length];&lt;br /&gt;
        &lt;br /&gt;
        // a and ret are pinned; they cannot be moved by&lt;br /&gt;
        // the garbage collector inside the fixed block.&lt;br /&gt;
        fixed (Point* src = a, dest = ret)&lt;br /&gt;
        {&lt;br /&gt;
            Point*    pSrc = src;&lt;br /&gt;
            Point*    pDest = dest;&lt;br /&gt;
            for (int index = 0; index &amp;lt; a.Length; index++)&lt;br /&gt;
            {&lt;br /&gt;
                *pDest = *pSrc;&lt;br /&gt;
                pSrc++;&lt;br /&gt;
                pDest++;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return(ret);&lt;br /&gt;
    }&lt;br /&gt;
    // import CopyMemory from kernel32&lt;br /&gt;
    [DllImport(&amp;quot;kernel32.dll&amp;quot;)]&lt;br /&gt;
    unsafe public static extern void &lt;br /&gt;
    CopyMemory(void* dest, void* src, int length);&lt;br /&gt;
    &lt;br /&gt;
    // unsafe version calling CopyMemory()&lt;br /&gt;
    unsafe public static Point[] ClonePointArrayMemcpy(Point[] a)&lt;br /&gt;
    {&lt;br /&gt;
        Point[] ret = new Point[a.Length];&lt;br /&gt;
        &lt;br /&gt;
        fixed (Point* src = a, dest = ret)&lt;br /&gt;
        {&lt;br /&gt;
            CopyMemory(dest, src, a.Length * sizeof(Point));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        return(ret);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    public override string ToString()&lt;br /&gt;
    {&lt;br /&gt;
        return(String.Format(&amp;quot;({0}, {1})&amp;quot;, x, y));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    int x;&lt;br /&gt;
    int y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Use fixed to get a pointer to the start of a string==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
C#: The Complete Reference &lt;br /&gt;
by Herbert Schildt &lt;br /&gt;
Publisher: Osborne/McGraw-Hill (March 8, 2002)&lt;br /&gt;
ISBN: 0072134852&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
// Use fixed to get a pointer to the start of a string. &lt;br /&gt;
 &lt;br /&gt;
using System; &lt;br /&gt;
 &lt;br /&gt;
public class FixedString { &lt;br /&gt;
  unsafe public static void Main() { &lt;br /&gt;
    string str = &amp;quot;this is a test&amp;quot;; &lt;br /&gt;
 &lt;br /&gt;
    // Point p to start of str. &lt;br /&gt;
    fixed(char* p = str) { &lt;br /&gt;
 &lt;br /&gt;
      // Display the contents of str via p. &lt;br /&gt;
      for(int i=0; p[i] != 0; i++) &lt;br /&gt;
        Console.Write(p[i]); &lt;br /&gt;
    } &lt;br /&gt;
 &lt;br /&gt;
    Console.WriteLine(); &lt;br /&gt;
     &lt;br /&gt;
  } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	</feed>