文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C#中结构和类成员指针的内存分配

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

时间:2010-09-23  来源:关羽

 

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

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

作者:Magci 日期:2009-01-08 02:29

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

TestPointerExampleTwo.cs:
view source print? 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.}
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载