在c#中怎么获取变量的内存地址并输出
在VS2005编译staticvoidMain(string[]args){inta=0;Console.WriteLine(a);}我想输出变量a在内存的地址怎么输出请...
在VS2005编译
static void Main(string[] args)
{
int a=0;
Console.WriteLine(a);
}
我想输出变量a在内存的地址怎么输出
请带我写下 展开
static void Main(string[] args)
{
int a=0;
Console.WriteLine(a);
}
我想输出变量a在内存的地址怎么输出
请带我写下 展开
4个回答
展开全部
首先, 我们知道, 当我们定义一个字符串变量并给它赋值时, 系统会分配一个内存空间给该变量用于存放数据, 如下面代码
string a;
string b;
a = "ABCD";
b = a:
a="EEEE"
Console.WriteLine(a);
Console.WriteLine(b);
运行结果是:
a: EEEE
b: ABCD
在这里我们定义了两个字符串变量a和b, 当给a赋值时, 系统就在内存中分配了一个内存地址空间给变量a存放此数据, 而此时a就被指向了. 而当把a的值赋予变量b时, 此时系统不会分配一个新的内存空间给变量b了,而是直接将变量b指向变量a的内存地址,从而节约内存资源,此时b的值就是"ABCD", 接下来改变a的值为”EEEE”, 说到这里一些朋友可能会说, 从输出结果可以看出a的值不就从原来的"ABCD"改成了"EEEE"了吗?不就改了a的值了吗? 呵呵, 其实一开始我也是这样想的, 但细想一下, 上面a和b都是指向了相同的内存地址,那如果a的值被改写了, 那是不是a所指向的内存地址上面的内容就被改变了?这样一来不就连同样是指向于这个内存地址的变量b的值也跟着一起被改变了, 但从上面的代码中我们可以看到, 最后输出的a,b两个变量值是不相同的, 在dotnet这个内存管理模式中, 只就一种可能性就是当我们给变量a 的值发生改变, 系统就重新给它分配了一个新的内存空间,确保资源的最大利用率
湖北新蓝海是一家专注于网络营销 网络推广的领头企业 ,已为武汉健民、华工激光、江西仁和等多家知名企业提供网络营销外包服务。详情请到各大搜索引擎中搜索“湖北新蓝海”
string a;
string b;
a = "ABCD";
b = a:
a="EEEE"
Console.WriteLine(a);
Console.WriteLine(b);
运行结果是:
a: EEEE
b: ABCD
在这里我们定义了两个字符串变量a和b, 当给a赋值时, 系统就在内存中分配了一个内存地址空间给变量a存放此数据, 而此时a就被指向了. 而当把a的值赋予变量b时, 此时系统不会分配一个新的内存空间给变量b了,而是直接将变量b指向变量a的内存地址,从而节约内存资源,此时b的值就是"ABCD", 接下来改变a的值为”EEEE”, 说到这里一些朋友可能会说, 从输出结果可以看出a的值不就从原来的"ABCD"改成了"EEEE"了吗?不就改了a的值了吗? 呵呵, 其实一开始我也是这样想的, 但细想一下, 上面a和b都是指向了相同的内存地址,那如果a的值被改写了, 那是不是a所指向的内存地址上面的内容就被改变了?这样一来不就连同样是指向于这个内存地址的变量b的值也跟着一起被改变了, 但从上面的代码中我们可以看到, 最后输出的a,b两个变量值是不相同的, 在dotnet这个内存管理模式中, 只就一种可能性就是当我们给变量a 的值发生改变, 系统就重新给它分配了一个新的内存空间,确保资源的最大利用率
湖北新蓝海是一家专注于网络营销 网络推广的领头企业 ,已为武汉健民、华工激光、江西仁和等多家知名企业提供网络营销外包服务。详情请到各大搜索引擎中搜索“湖北新蓝海”
推荐于2016-06-16 · 知道合伙人数码行家
关注
展开全部
C#的指针用途非常有限,值类型可以用指针来操作,但引用类型就不行了。
以下是代码:
using System.Runtime.InteropServices;
using System;
namespace ConsolePrototype
{
public class A
{
}
class Program
{
static void Main(string[] args)
{
A a = new A();
GCHandle hander = GCHandle.Alloc(a);
var pin = GCHandle.ToIntPtr(hander);
Console.WriteLine(pin);
}
}
}
以下是代码:
using System.Runtime.InteropServices;
using System;
namespace ConsolePrototype
{
public class A
{
}
class Program
{
static void Main(string[] args)
{
A a = new A();
GCHandle hander = GCHandle.Alloc(a);
var pin = GCHandle.ToIntPtr(hander);
Console.WriteLine(pin);
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个跟C语言里一样不过就是得加个unsafe,项目属性里勾上“允许不安全代码”,例子MSDN上有我就不写了
http://msdn.microsoft.com/zh-cn/library/zcbcf4ta.aspx
http://msdn.microsoft.com/zh-cn/library/zcbcf4ta.aspx
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int a =123;
float b=0.2;
int a_address,b_address;
unsafe
{
a_address=&a;
b_address=&b;// 注意地址长度!比如Double占64byte,再比如获取一串字符串的地址,注意自己偏移设置就行
}
注意unsafe括起来啊!!
float b=0.2;
int a_address,b_address;
unsafe
{
a_address=&a;
b_address=&b;// 注意地址长度!比如Double占64byte,再比如获取一串字符串的地址,注意自己偏移设置就行
}
注意unsafe括起来啊!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询