差异b / n对象,参考,指针

时间:2014-05-06 03:21:22

标签: c# c++ c pointers

我开始用c编程,然后在Java和c#上做了一点点工作。

  • 所以我对一个对象(一个类的实例)的理解是它就像一个指向存储在内存中的实例的指针(可能指向整个实例的第一个内存单元......类似于struct或array A []的初始地址存储在A)中。

我的上述理解是否正确?

从上面的内容中我知道两者都是相同的,除了引用gaurds你没有取空。

我不明白的一点是他们说: 指针变量可以在初始化后重新分配,但引用变量不能。但我测试了这个场景,编译器允许我重新赋值,它是否依赖于编译器?? 如果根本不能重新分配一个不同的值,那么根本没有使用'pass by ref'(在c ++中)?

也可以有人建议一个可靠而酷的c ++在线资源,比如c#的msdn

如果有一种简单的方法可以在c ++中查看存储在引用变量中的地址,那就太好了

2 个答案:

答案 0 :(得分:1)

我相信你的理解大多是正确的。

关于你的最后一个问题,在C ++中你可以通过给它一个新的值来改变指针指向的内容:

int a, b;
int *p = &a;
p = &b;

但是,你不能对引用做同样的事情:

int a, b;
int &r = a;
// ??? no syntax to make r refer to b at this point

答案 1 :(得分:0)

  

如果是这样,为什么c#通过引用传递

C#没有通过引用传递..它是按值传递(除非明确使用ref)。将复制引用的

您可以将引用视为指针..具有类型安全性。底层实现细节没什么影响(尽管如我所知,它们目前是指针的包装器......但它们可能并不总是如此)。

  

指针变量可以在初始化后重新分配,但引用变量不能。但我测试了这个场景,编译器允许我重新分配,

重新分配您描述的引用没有限制。新引用将复制到现有引用的顶部。所以我不确定我是否理解这个问题。

我认为通过方法传递引用时,您对上述内容的理解是不正确的。这是一个例子:

public class Customer {
    public string FirstName { get; set; }
}

public static void Main() {
    var customer = new Customer() { FirstName = "Simon" };
    Example(customer);
    Console.WriteLine(customer.FirstName);
}

public static void Example(Customer customer) {
    customer = new Customer() { FirstName = "CHANGED" };
}

Working example here

这会打印什么?答案是" Simon"。引用被复制到函数中。您已重新分配了本地参考。退出时......原始参考文献保持不变。

你如何修复"那? (不是我希望以下行为......)..你明确地通过ref传递:

public class Customer {
    public string FirstName { get; set; }
}

public static void Main() {
    var customer = new Customer() { FirstName = "Simon" };
    Example(ref customer); // By ref
    Console.WriteLine(customer.FirstName);
}

public static void Example(ref Customer customer) { // By ref
    customer = new Customer() { FirstName = "CHANGED" };
} 

Working sample here

这会打印"已更改",因为ref关键字的用户已请求显式的pass-by-ref。