【问题标题】:Difference b/n objects, Reference, Pointers [closed]差异 b/n 对象、参考、指针
【发布时间】:2014-05-06 03:21:22
【问题描述】:

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

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

我上面的理解正确吗?

从上面的阅读中我了解到两者都是相同的,除了引用不取 null 来保护你。

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

也有人可以推荐一个可靠且酷的 c++ 在线资源,例如 c# 的 msdn

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

【问题讨论】:

  • 引用本身不能引用新变量。并且 C# 具有按引用传递(我假设您的意思是 ref),因为值类型是按值传递的。 Java 也有这些(原语),但不允许您像 C# 那样创建自己的(尽管有限)。 C++ 默认是按值传递的。
  • C++ 的最新参考资料是cppreference.com
  • 我在 google 上找到了很多 cplusplus.com.. 够好吗
  • Greg Hewgill 在他的 cmets 中回答了这个问题。再次感谢他

标签: c# c++ c pointers


【解决方案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

【讨论】:

  • 如果你做 r = b; 会发生什么
  • 如果您执行r = b;,则b 的值将分配给a。引用 r 仍然引用 a
  • 现在我明白了!!非常感谢,这就是我想要的:)。我觉得这个帖子太多余了,我删除它可以吗?或者它可能对其他人有用?
  • 你现在不能删除它,它有答案。我觉得还可以。
  • 所以即使 a 和 b 是对象。在我们将 r 从 a 更改为 b 之后,现在 a 和 b 都指向同一个实例(b)..但是 r 仍然指向 a 的地址正确吗?
【解决方案2】:

如果是这样,为什么 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)

这会打印什么?答案是“西蒙”。引用已复制到函数中。您已重新分配本地参考。退出时..原始引用保持不变。

你如何“解决”这个问题? (并不是说我会期望以下行为..)..您明确地通过 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)

这将打印“CHANGED”,因为ref 关键字的用户已请求显式传递引用。

【讨论】:

  • 我知道 c# 是按值传递的,我的意思是,通过 ref..ref 关键字传递的目的是什么。很抱歉造成混乱。
  • 查看我的更新示例(以及运行示例的 IDEOne 链接)。
  • @Ojay 我不确定这如何反驳我的说法。 MSDN 示例清楚地演示了引用的传递值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 2015-01-24
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
相关资源
最近更新 更多