gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:23:06 26 4
gpt4 key购买 nike

我从网上找到了我无法理解这一行的代码:-

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

Scan0 是 System.IntPtr.它是C#.Net的代码。请解释上面一行。

完整代码如下。这是将图像转换为灰度的代码。

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;
}

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

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

最佳答案

首先将IntPtr 转换为void 指针。然后是一个byte指针。这是不安全代码。

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

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

关于c# - 解释这个 C# 代码 : byte* p = (byte*) (void*) Scan0;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1647721/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com