解释这个C#代码:byte*p =(byte*)(void*)Scan0;

qul*_*zam 1 c# pointers unsafe visual-studio-2008

我发现网上的代码我无法理解这一行: -

byte* p = (byte*)(void*)Scan0;
Run Code Online (Sandbox Code Playgroud)

Scan0是System.IntPtr. 它是C#.Net的代码.Plz解释上述内容.

完整的代码如下.这是用于转换灰度图像的代码.

public static Image GrayScale(Bitmap b)
    {

        BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

        int stride = bmData.Stride;
        System.IntPtr Scan0 = bmData.Scan0;

        unsafe
        {
            byte* p = (byte*)(void*)Scan0;

            int nOffset = stride - b.Width * 3;

            byte red, green, blue;

            for (int y = 0; y < b.Height; ++y)
            {
                for (int x = 0; x < b.Width; ++x)
                {
                    blue = p[0];
                    green = p[1];
                    red = p[2];

                    p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);

                    p += 3;
                }
                p += nOffset;
            }
        }

        b.UnlockBits(bmData);

        return (Image)b;
    }
Run Code Online (Sandbox Code Playgroud)

我理解所有的代码,但只有这一行的问题.

byte* p = (byte*)(void*)Scan0;
Run Code Online (Sandbox Code Playgroud)

Dan*_*ite 5

首先将其转换IntPtr为void指针.然后到byte指针.这是unsafe代码.

有关不安全代码的更多信息:http: //msdn.microsoft.com/en-us/library/aa288474%28VS.71%29.aspx

正如Robert Harvey所说,指针是一个记忆位置.在C/C++中,数组与此概念密切相关.当它做方括号时,它基本上是调整地址.

  • void指针以非常基本的方式指向NO SPECIFIC TYPE.因此,您获得一个指向不引用任何类型的地址的指针,只是指向该地址的数据.然后,你可以自由地把它投射到你喜欢的任何地方.在这个例子中,他们将Int转换为void(无).然后将void指针(原始内存地址)强制转换为字节的地址.(好主人,自从我与之合作以来,这是永远的.如果我错了,请有人纠正我.) (3认同)