unsafe public static void Main()
    {
        Console.WriteLine($"Size of CurrencyStruct struct is {sizeof(CurrencyStruct)}");
        CurrencyStruct amount1 = new(10, 10), amount2 = new(20, 20);

        CurrencyStruct *pAmount  = &amount1;
        long *          pDollars = &(pAmount->Dollars);
        byte *          pCents   = &(pAmount->Cents);

        Console.WriteLine($"Address of amount1 is 0x{(ulong)&amount1:X}");
        Console.WriteLine($"Address of amount2 is 0x{(ulong)&amount2:X}");
        Console.WriteLine($"Address of pAmount is 0x{(ulong)&pAmount:X}");
        Console.WriteLine($"Value of pAmount is 0x{(ulong)pAmount:X}");
        Console.WriteLine($"Address of pDollars is 0x{(ulong)&pDollars:X}");
        Console.WriteLine($"Value of pDollars is 0x{(ulong)pDollars:X}");
        Console.WriteLine($"Address of pCents is 0x{(ulong)&pCents:X}");
        Console.WriteLine($"Value of pCents is 0x{(ulong)pCents:X}");

        // because Dollars are declared readonly in CurrencyStruct, you cannot change it with a variable of type CurrencyStruct
        // pAmount->Dollars = 20;
        // but you can change it via a pointer referencing the memory address!
        *pDollars = 100;
        Console.WriteLine($"amount1 contains {amount1}");

        --pAmount;   // this should get it to point to amount2
        Console.WriteLine($"pAmount contains the new address {(ulong)pAmount:X} " +
                          $"and references this value {*pAmount}");

        // do some clever casting to get pCents to point to cents
        // inside amount2
        CurrencyStruct *pTempCurrency = (CurrencyStruct *)pCents;

        pCents = (byte *)(--pTempCurrency);
        Console.WriteLine($"Value of pCents is now 0x{(ulong)pCents:X}");
        Console.WriteLine($"The value where pCents points to: {*pCents}");

        Console.WriteLine("\nNow with classes");
        // now try it out with classes
        CurrencyClass amount3 = new(30, 0);

        fixed(long *pDollars2 = &(amount3.Dollars))
        fixed(byte *pCents2 = &(amount3.Cents))
        {
            Console.WriteLine($"amount3.Dollars has address 0x{(ulong)pDollars2:X}");
            Console.WriteLine($"amount3.Cents has address 0x{(ulong)pCents2:X}");
            *pDollars2 = -100;
            Console.WriteLine($"amount3 contains {amount3}");
        }

        // use a function pointer
        FunctionPointerSample.Calc(&Add);
        FunctionPointerSample.Calc(&Subtract);
    }
Exemple #2
0
        unsafe public static void Main()
        {
            Console.WriteLine($"Size of CurrencyStruct struct is {sizeof(CurrencyStruct)}");
            CurrencyStruct  amount1, amount2;
            CurrencyStruct *pAmount  = &amount1;
            long *          pDollars = &(pAmount->Dollars);
            byte *          pCents   = &(pAmount->Cents);

            Console.WriteLine($"Address of amount1 is 0x{(ulong)&amount1:X}");
            Console.WriteLine($"Address of amount2 is 0x{(ulong)&amount2:X}");
            Console.WriteLine($"Address of pAmount is 0x{(ulong)&pAmount:X}");
            Console.WriteLine($"Address of pDollars is 0x{(ulong)&pDollars:X}");
            Console.WriteLine($"Address of pCents is 0x{(ulong)&pCents:X}");
            pAmount->Dollars = 20;
            *pCents = 50;
            Console.WriteLine($"amount1 contains {amount1}");

            --pAmount;   // this should get it to point to amount2
            Console.WriteLine($"amount2 has address 0x{(ulong)pAmount:X} " +
                              $"and contains {*pAmount}");

            // do some clever casting to get pCents to point to cents
            // inside amount2
            CurrencyStruct *pTempCurrency = (CurrencyStruct *)pCents;

            pCents = (byte *)(--pTempCurrency);
            Console.WriteLine("Address of pCents is now 0x{0:X}", (ulong)&pCents);

            Console.WriteLine("\nNow with classes");
            // now try it out with classes
            var amount3 = new CurrencyClass();

            fixed(long *pDollars2 = &(amount3.Dollars))
            fixed(byte *pCents2 = &(amount3.Cents))
            {
                Console.WriteLine($"amount3.Dollars has address 0x{(ulong)pDollars2:X}");
                Console.WriteLine($"amount3.Cents has address 0x{(ulong)pCents2:X}");
                *pDollars2 = -100;
                *pCents2   = 2;
                Console.WriteLine($"amount3 contains {amount3}");
                var d = &pDollars2;

                //&pCents2;
                Console.WriteLine($"amount3.Dollars has address 0x{(ulong)pDollars2:X}");
                Console.WriteLine($"amount3.Cents has address 0x{(ulong)pCents2:X}");
            }
        }
Exemple #3
0
        private static unsafe void Main()
        {
            Console.WriteLine("Size of Currency struct is " + sizeof(CurrencyStruct));
            CurrencyStruct  amount1, amount2;
            CurrencyStruct *pAmount  = &amount1;
            long *          pDollars = &(pAmount->Dollars);
            byte *          pCents   = &(pAmount->Cents);

            Console.WriteLine("Address of amount1 is 0x{0:X}", (uint)&amount1);
            Console.WriteLine("Address of amount2 is 0x{0:X}", (uint)&amount2);
            Console.WriteLine("Address of pAmt is 0x{0:X}", (uint)&pAmount);
            Console.WriteLine("Address of pDollars is 0x{0:X}", (uint)&pDollars);
            Console.WriteLine("Address of pCents is 0x{0:X}", (uint)&pCents);
            pAmount->Dollars = 20;
            *pCents = 50;
            Console.WriteLine("amount1 contains " + amount1);
            --pAmount;   // this should get it to point to amount2
            Console.WriteLine("amount2 has address 0x{0:X} and contains {1}",
                              (uint)pAmount, *pAmount);
            // do some clever casting to get pCents to point to cents
            // inside amount2
            CurrencyStruct *pTempCurrency = (CurrencyStruct *)pCents;

            pCents = (byte *)(--pTempCurrency);
            Console.WriteLine("Address of pCents is now 0x{0:X}", (uint)&pCents);
            Console.WriteLine("\nNow with classes");
            // now try it out with classes
            CurrencyClass amount3 = new CurrencyClass();

            fixed(long *pDollars2 = &(amount3.Dollars))
            fixed(byte *pCents2 = &(amount3.Cents))
            {
                Console.WriteLine("amount3.Dollars has address 0x{0:X}", (uint)pDollars2);
                Console.WriteLine("amount3.Cents has address 0x{0:X}", (uint)pCents2);
                *pDollars2 = -100;
                Console.WriteLine("amount3 contains " + amount3);
            }
            Console.ReadLine();
        }
Exemple #4
0
        private static unsafe void Main()
        {
            Console.WriteLine("Size of Currency struct is {0}", sizeof(CurrencyStruct));
            CurrencyStruct  amount1, amount2;
            CurrencyStruct *pAmount  = &amount1;
            long *          pDollars = &(pAmount->Dollars);
            byte *          pCents   = &(pAmount->Cents);

            Console.WriteLine("Address of amount1 is 0x{0:X}", (uint)&amount1);
            Console.WriteLine("Address of amount2 is 0x{0:X}", (uint)&amount2);
            Console.WriteLine("Address of pAmt is 0x{0:X}", (uint)&pAmount);
            Console.WriteLine("Address of pDollars is 0x{0:X}", (uint)&pDollars);
            Console.WriteLine("Address of pCents is 0x{0:X}", (uint)&pCents);
            pAmount->Dollars = 20;
            *pCents = 50;
            Console.WriteLine("amount1 contains {0}", amount1);
            --pAmount; // Note: это должно переустановить указатель на amount2
            Console.WriteLine("amount2 has address 0x{0:X} and contains {1}", (uint)pAmount, *pAmount);
            // Note: Выполнить некоторое интеллектуальное приведение, чтобы установить
            // указатель pCents на значение центов внутри amount2
            var pTempCurrency = (CurrencyStruct *)pCents;

            pCents = (byte *)(--pTempCurrency);
            Console.WriteLine("Address of pCents is now 0x{0:X}", (uint)&pCents);
            Console.WriteLine("\nNow with classes");
            // Пробуем указатели с классами
            var amount3 = new CurrencyClass();

            fixed(long *pDollars2 = &(amount3.Dollars))
            fixed(byte *pCents2 = &(amount3.Cents))
            {
                Console.WriteLine("amount3.Dollars has address 0x{0:X}", (uint)pDollars2);
                Console.WriteLine("amount3.Cents has address 0x{0:X}", (uint)pCents2);
                *pDollars2 = -100;
                Console.WriteLine("amount3 contains {0}", amount3);
            }

            Console.ReadLine();
        }