对C#中的指针感到困惑

时间:2011-08-05 03:45:34

标签: c#

我知道这可能是一个低质量的问题,但请不要 - 因为我作为一个指针的初学者我很困惑,我无法在任何地方找到我的问题的答案......

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,这是一个asigning指针是十六进制值......

其他时候他们做* ptr = 85;这基本上是指向一个整数值85,所以* ptr保持值85,并且* ptr访问指针的值,其中int ptr是指针的地址,所以它对我如何SWAP地址是没有意义的当我看到他们所做的一切都是通过使用* ptr ...

交换VALUES时的指针

请清除我的困惑

2 个答案:

答案 0 :(得分:3)

我认为你刚刚得到它。它不是被交换的指针的地址,而是交换的值,因为您将指针的地址发送到Swap()函数。当你调用Swap(&x,&y)时,一个指向x的地址指针和一个指向y的地址指针被发送到该函数,Swap()可以使用这些地址来知道交换新值的位置。

换句话说,当你传递指针时,你传递的是一个你将使用值的内存位置,而不仅仅是值本身。这样,您的函数可以更新原始变量。这是使用指针的语言的美(和诅咒)。

关于*ptr = &address的评论,仅当ptr是指向指针的指针时才有效,这有点高级。每当您使用*运算符赋值时,您都会将该指针的值赋给等号右侧的值。如果指针恰好指向另一个指针,则它可以是一个地址。

答案 1 :(得分:0)

我没有在C#中使用指针,但根据我在C

中的知识

为指针分配地址,语法为

PTR =安培;地址

而不是

* PTR =安培;地址