int x;
int *y = &x; // От любой переменной можно взять адрес при помощи операции взятия адреса "&". Эта операция возвращает указатель
int z = *y; // Указатель можно разыменовать при помощи операции разыменовывания "*". Это операция возвращает тот объект, на который указывает указатель
从概念上讲,是的。它们解决了指向一个对象的问题。但存在实施差异。
指针包含一个地址。事实上,引用是一种抽象,没有说明它们的含义(尽管事实上,CLR 也在其中放置了一个地址)。
C# 中的引用始终引用有效对象或等于
null,而指针可以指向随机内存区域。(感谢@VladD 的评论)此外,C 指针是“静态”的,dotnet 中的对象可以由垃圾收集器重新定位,即 链接会改变它们的含义。
另一个区别来自这个事实:在指针的情况下,可以安全地进行算术运算(例如,访问数组的第 i 个元素,拥有指向数组的指针并知道元素的大小),在在引用的情况下,事实并非如此。
C#也有指针。它们相当于 C 中的指针。
让我用一个简单的例子来解释单词andreycha:
假设有一个人名叫 Vasily Pupkin,他住在 Lenina, 1。他的地址是一个指针。而“瓦夏之家”的概念就是一个参考。你可以说:“我们要去 Vasya 家里参加一个聚会”,但不要给出确切的地址。
如果 Vasily 现在移动到 2 Lennon Street,那么地址将会改变,因此指针也应该改变。同时,链接“Vasya's house”将像以前一样有效。
我想对 andreycha 的回答发表评论,但后来我认为发布一个单独的答案会更好。
先说C/C++中指针(pointer)的概念是一个对象在RAM中的地址,代表如下语法:
也就是说,名称前有一个星号。
也有参考
引用 +- 与指针相同,但具有不同的语法和其他一些重要差异。它们在那里协同工作,相得益彰:通过一个指针,你可以在C/C++中通过引用找出值。
C# 也有指针和引用。指针语法是相同的星号,并且与 C/C++ 中的应用完全相同(这被认为是不安全代码,您需要在项目设置中选中“允许不安全代码”复选框并使用不安全方法修饰符)。也可以使用关键字
ref而不是 & 隐式传递引用。尽管 ref 在 Sharpe 中的使用通常与在 C++ 中的 & 略有不同,但实现也相应不同。ref在夏普中的使用示例:我不会说 C 中的指针/引用类似于 C# 中的引用类型。引入引用类型的概念只是所选实现的结果,而不是等效的. 直接类比只是上述指定指针/引用的方法。
不加考虑地直接使用引用类型作为类比是不好的做法。例如,如果您知道传递的参数会在方法中发生变化,则
List<T> someList需要添加ref List<T> someList,即使它已经是引用类型并且传递对引用类型的引用似乎没有任何意义。但这是有道理的,因为你将来可能会不经意地欺骗另一个程序员或你自己。在所有其他方面,我同意 andreycha 的回答和 VladD 的补充。那是: