对c#中的指针感到困惑

本文关键字:指针 | 更新日期: 2023-09-27 18:04:29

我知道这可能是一个低质量的问题,但请不要代表我,因为作为一个初学者,我对这个问题非常困惑,我找不到我的问题的答案。

using System;
class MyTest
{
    unsafe static void Swap( int *a, int *b )
    {
        int tmp = *a;
        *a = *b;
        *b = tmp;
    }
    unsafe static void Main(string [] args)
    {
        int x = 5;
        int y = 12;
        Console.WriteLine( "x = {0}, y = {1}", x, y );
        Swap( &x, &y );
        Console.WriteLine( "x = {0}, y = {1}", x, y );
    }
}

我真的很困惑这个....有时它们会*ptr=&address,它将十六进制值address分配给指针....因此,这是指向一个地址,这是分配给指针一个十六进制值…

*ptr=85;这基本上是给指针赋值85的整数值,所以*ptr保存85的值,做*ptr访问指针的值,其中int ptr是指针的地址,所以对我来说,当我看到他们所做的只是通过使用*ptr交换值时,他们如何交换指针的地址是没有意义的…

Please clear my confusion

对c#中的指针感到困惑

我想你已经明白了。被交换的不是指针的地址,而是被交换的值,因为您将指针的地址发送给Swap()函数。当你调用Swap(&x,&y)时,一个指向x的地址指针和一个指向y的地址指针被发送给函数,Swap()可以使用这些地址知道在哪里放置交换的新值。

换句话说,当你传递指针时,你传递的是一个内存位置,你将使用其中的值,而不仅仅是值本身。通过这种方式,您的函数可以更新原始变量。这就是使用指针的语言的优点(也是缺点)。

至于你对*ptr = &address的评论,这只有在ptr是指向指针的指针时才有效,这是更高级的。无论何时使用*操作符赋值,都是将该指针的值赋给等号右侧的值。如果指针碰巧指向另一个指针,它可以是一个地址。

我没有在c#中使用指针,但根据我对C的了解

为指针分配地址,语法为

ptr =,地址

而非

* ptr =,地址