//
// Copyright (c) 2002
// Ronald Kevin Burton
//
// Z poniższym kodem nie jest związana żadna gwarancja poprawności działania.
// Program został dołączony do książki ".NET CLR. Księga eksperta" w celu
// ilustracji koncepcji i zasad przedstawionych w tej książce. Program może być 
// używany na własne ryzyko.
//
// Przyznaje się prawo do użycia lub kopiowania tego oprogramowania do dowolnego celu
// bez konieczności ponoszenia żadnych opłat pod warunkiem, że powyższe uwagi zostaną 
// zachowane we wszystkich kopiach. Przyznaje się także prawo do modyfikacji kodu
// i dystrybucji zmodyfikowanego kodu pod warunkiem zachowania powyższych uwag
// oraz dołączenia informacji mówiącej o modyfikacji kodu.
//
// 
using System;

namespace CLRUnleashed
{
	/// <summary>
	/// Podsumowanie dla Class1.
	/// </summary>
	public class G 
	{
		public int i;
		public G next;
	}
	class Unsafe
	{
		unsafe static void UnsafePointers() 
		{
			// pG to cały wskaźnik obiektu
			G pG = new G();
			// ipi to wewnętrzny wskaźnik
			fixed(int* ipi = &(pG.i))
			{
				*ipi = 10;
			}
			// ppG to wewnętrzny wskaźnik
			G ppG = pG.next;
			// *ppG to cały wskaźnik obiektu
			pG.next = new G();
		}

		unsafe static void StringAddress(string s)
		{
			fixed(char *p = s)
			{
				Console.WriteLine("0x{0:X8}", (uint)p);
			}       
		}
		/// <summary>
		/// Główny punkt wejścia dla aplikacji.
		/// </summary>
		[STAThread]
		static void Main(string[] args)
		{
			StringAddress("Jaki jest adres tego ciągu?");
			UnsafePointers();
		}
	}
}
