zoukankan      html  css  js  c++  java
  • C#中结构和类成员指针的内存分配

     

    C#中结构和类成员指针的内存分配

    http://mgc.name/article.asp?id=600

    通过结构和类成员指针的操作,观察内存分配情况:
    1.结构、类成员是按顺序排列在内存中的;
    2.通过指针操作可以方便的指向任意变量。

    TestPointerExampleTwo.cs:
    01.using System;
    02.  
    03.namespace Magci.Test.Pointers
    04.{
    05.    //结构
    06.    internal struct CurrencyStruct
    07.    {
    08.        public long Dollars;
    09.        public byte Cents;
    10.  
    11.        public override string ToString()
    12.        {
    13.            return "$" + Dollars + "." + Cents;
    14.        }
    15.    }
    16.  
    17.    //类
    18.    internal class CurrencyClass
    19.    {
    20.        public long Dollars;
    21.        public byte Cents;
    22.  
    23.        public override string ToString()
    24.        {
    25.            return "$" + Dollars + "." + Cents;
    26.        }
    27.    }
    28.  
    29.    public class TestPointerExampleTwo
    30.    {
    31.        public static unsafe void Main()
    32.        {
    33.            Console.WriteLine("Size of CurrencyStruct struct is " sizeof(CurrencyStruct));
    34.            CurrencyStruct amount1, amount2;
    35.            CurrencyStruct* pAmount = &amount1;
    36.            long* pDollars = & (pAmount->Dollars);
    37.            byte* pCents = & (pAmount->Cents);
    38.  
    39.            Console.WriteLine("Address of amount1 is [0x{0:X}]", (uint)&amount1);
    40.            Console.WriteLine("Address of amount2 is [0x{0:X}]", (uint)&amount2);
    41.            Console.WriteLine("Address of pAmount is [0x{0:X}]", (uint)&pAmount);
    42.            Console.WriteLine("Address of pDollars is [0x{0:X}]", (uint)&pDollars);
    43.            Console.WriteLine("Address of pCents is [0x{0:X}]", (uint)&pCents);
    44.  
    45.            pAmount->Dollars = 20;
    46.            *pCents = 50;
    47.              
    48.            Console.WriteLine("amount1 contains [{0}]", amount1);
    49.            //amount2存储在amount1后面的地址上,pAmount开始指向amount1,递减后就指向了amount2
    50.            --pAmount;
    51.            //amount2没有进行初始化,值是随机的;使用指针时会绕过很多通常的编译检查,因此指针算法是不安全的
    52.            Console.WriteLine("amount2 has address [0x{0:X}] and contains [{1}]", (uint)pAmount, *pAmount);
    53.  
    54.            //将pCents指向amount2.Cents
    55.            CurrencyStruct* pTempCurrency = (CurrencyStruct*)pCents;
    56.            pCents = (byte*)(--pTempCurrency);
    57.            Console.WriteLine("Address of pCents is now [0x{0:X}]", (uint)&pCents);
    58.              
    59.            Console.WriteLine("\nNow with classes");
    60.            CurrencyClass amount3 = new CurrencyClass();
    61.  
    62.            fixed (long* pDollars2 = &(amount3.Dollars))
    63.            fixed (byte* pCents2 = &(amount3.Cents))
    64.            {
    65.                Console.WriteLine("amount3.Dollars has address [0x{0:X}]", (uint)pDollars2);
    66.                Console.WriteLine("amount3.Cents has address [0x{0:X}]", (uint)pCents2);
    67.                *pDollars2 = -100;
    68.                Console.WriteLine("amount3 contains [{0}]", amount3);
    69.            }
    70.        }
    71.    }
    72.}
  • 相关阅读:
    《人月神话》阅读笔记02
    学习进度条-4
    课堂作业3
    MySql 8.0及对应驱动包匹配注意点
    关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案
    STM32之ADC配置,ADC_Mode模式理解
    STM32串口中断的方式发送
    RTC 与RCC 之间的关系
    stm32 MDK5软件仿真之查看io口输出
    STM32 PWM学习
  • 原文地址:https://www.cnblogs.com/pumax/p/1833230.html
Copyright © 2011-2022 走看看