我开始用c编程,然后在Java和c#上做了一点点工作。
我的上述理解是否正确?
最近我一直在经历差异b / n引用和 c ++中的指针。这是我阅读时更加混乱的地方 more.Like:
When to use references vs. pointers
What are the differences between a pointer variable and a reference variable in C++?
从上面的内容中我知道两者都是相同的,除了引用gaurds你没有取空。
我不明白的一点是他们说: 指针变量可以在初始化后重新分配,但引用变量不能。但我测试了这个场景,编译器允许我重新赋值,它是否依赖于编译器?? 如果根本不能重新分配一个不同的值,那么根本没有使用'pass by ref'(在c ++中)?
也可以有人建议一个可靠而酷的c ++在线资源,比如c#的msdn
如果有一种简单的方法可以在c ++中查看存储在引用变量中的地址,那就太好了
答案 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" };
}
这会打印什么?答案是" 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" };
}
这会打印"已更改",因为ref
关键字的用户已请求显式的pass-by-ref。