C# C+中指针之间的差异+;C语言中的索引和引用类型# C++中指针是指向内存地址的指针,在这里存储另一个变量,而在C中引用是相同的。这两者之间的区别是什么?

C# C+中指针之间的差异+;C语言中的索引和引用类型# C++中指针是指向内存地址的指针,在这里存储另一个变量,而在C中引用是相同的。这两者之间的区别是什么?,c#,c++,pointers,reference,C#,C++,Pointers,Reference,在C#中,引用类型将在不再需要时自动进行垃圾收集。第一个区别是不能对引用使用指针算术。否则,它们几乎是一样的 两者都指向/引用实际对象 两者都可以为NULL/NULL(即不指向有效对象) 两者都可以指定一个新对象 另一个区别是垃圾收集器负责C#中分配的资源。。在C++中,你必须自己删除它们(或者使用智能指针)。 然后,当然。。。您不必在C#中手动取消引用即可访问该值。C++是物理级别的指针,用于存储物理地址的值。C#参考 而是一个隐藏或不透明的指针,你只知道它指向某个对象 在C++中,你可以

在C#中,引用类型将在不再需要时自动进行垃圾收集。

第一个区别是不能对引用使用指针算术。否则,它们几乎是一样的

  • 两者都指向/引用实际对象
  • 两者都可以为NULL/NULL(即不指向有效对象)
  • 两者都可以指定一个新对象
另一个区别是垃圾收集器负责C#中分配的资源。。在C++中,你必须自己删除它们(或者使用智能指针)。
然后,当然。。。您不必在C#中手动取消引用即可访问该值。

C++是物理级别的指针,用于存储物理地址的值。C#参考 而是一个隐藏或不透明的指针,你只知道它指向某个对象

在C++中,你可以在物理层上使用指针——内存操作或 使用它访问它指向的对象

// physical level operation

// set pointer to specific address
byte *pPointer = 0x00LB10;
// increment pointer
pPointer++; 

// OR
// dereference operation for classes and structure
pPointer->MyProperty
在C#中,只能使用引用(引用类型对象) 访问对象

MyReference.Property

C#中所谓的引用是通过指向实际对象指针的指针实现的。它们被称为句柄,虽然句柄本身在程序的整个生命周期内保持不变,但在内存压缩阶段,当垃圾收集器在内存中移动对象时,内部指针会发生变化。

这些是不同的。在C++中,Booo::SyrdypTR有点类似于C ^参考文献,但也是一个明显的野兽(这两个)。 指向将由垃圾收集器处理的对象的引用点。 共享的ptr也会发生同样的情况。然而,C#和boost::shared#ptr跟踪对象生命周期的方式在概念上存在差异(见下文)

C++指针可以指向任何东西,要么在堆栈上分配(在这种情况下,不需要进行处理),要么在堆上静态分配,要么在需要时手动分配,然后必须释放,这完全由程序员负责

共享ptr和C参考之间的差异:

shared_ptr是一个参考计数器。它统计指针存在的克隆数,如果没有,则处理对象。当a指向B而B指向a时,这并不能提供防止交叉引用(或循环引用)的解决方案,但不再需要a和B


垃圾收集处理这个问题。C#不计算引用。相反,它维护了一个可访问性列表——可以通过我们所有的开放指针访问的内容。不能做的事就处理掉。这种方法更安全,但在性能可预测性方面有几个缺点。

对我来说,概念是相同的,或者至少是打算相同的,但给出的实际用途不是

当我们谈论指针或参考时,我们谈论的是一个概念。这个变量“指向”或“引用”其他东西,存储在其他地方的东西

如果我使用那个引用,例如通过更新值,我实际上是在更新被引用的对象,变量指向的对象。如果我有一个对象从两个不同的地方引用,我实际上是从两个地方更新相同的东西

所以这个概念可以和你在现实世界中的地址联系起来,只是一种引用其他事物的方式,这种引用可以共享,就像很多人都有我的地址一样

区别在于它是如何被使用的,以及语言允许什么。请注意,引用或指针的实现细节并不隐含在概念本身中。在C#中,这仍然是正确的

一个引用就是一个引用,因此,对两个引用求和或向一个引用中添加一个引用是没有意义的。。。那意味着什么?我无法添加两个家庭地址(如贝克街+家庭街)

在C++中,引用的实现细节实际上是参考。这样一来,指针不仅是指针,它还是(并且用作)内存地址。例如,通过这种方式,您可以添加到指针,因为添加两个内存地址以获得另一个内存地址,或者向一个内存地址添加4是有意义的。所以<强> C++中指针停止为一个概念,AN成为实际实现细节< /强> ./P>的名称。 这就是为什么在C#中,指针和引用是不同的东西。因为,语义上的意思很相似,他们想区别于C和C++的旧概念,其中指针已经变成了与内存地址相同的。
我建议你读一读这篇文章,我认为他在解释这些差异方面做得很好。

只要读一读最好的人说的话即可。;-)还可以看到,虽然.NET运行时和垃圾收集器的不同实现可以自由地进行不同的操作,但带有停止世界垃圾收集器的.NET常见实现中的引用实际上是直接指针。当GC运行时,对可能移动的对象的每个引用都将被访问和更新,以反映对象的新位置。编译后的代码有一个与之相关的特殊元数据,为每个指令标记哪些寄存器保存活动引用,GC有能力更新存储在这些寄存器中的指针。下一票不是我的,但是有一个基本的区别你可以忽略:作为一个绝对不变量,.NET运行时认为,除了一种特殊情况外,宇宙中任何地方都不允许存在它不知道的引用:引用可以标记为“pinted”,而对pinted对象的外部引用可能存在于这样标记的对象中,但是有大量的pi