【发布时间】:2021-01-02 01:20:40
【问题描述】:
网上有很多示例如何获取指向byte[] 或int[,] 的指针,即当您确切知道数组的元素类型和等级时。但是如何获取泛型Array 的指针呢?
这里的主要问题是我不知道提前排名。我也不知道元素类型,但我知道只能有原始数字类型(在我的情况下),所以我可以输入一些额外的 ifs 来应对它。
背景:我想让这个解决方案https://stackoverflow.com/a/52750659/6734314 更通用——在它目前的形式下,它只适用于double[,],所以给出了经典的等级+类型:
double[,] doubles = {
{ 1, 2, 3, 4 },
...
};
fixed (double* p = doubles)
{
...
第一次尝试
从 Olivier 的回答中,所有的错误都是我的。
Array data = new float[,] { { 4, 2 }, { 77, 3 } };
var reference = __makeref(data);
IntPtr pointer = **(IntPtr**)(&reference);
float* ptr = (float*)pointer.ToPointer();
{
for (int i = 0; i < data.LongLength; ++i)
Console.WriteLine(ptr[i]);
}
【问题讨论】:
-
那么,数组中的指针总是第一个元素的地址,你能得到吗?如果您对数组一无所知,您如何获得数组,作为对象或其他东西?
-
注意:大多数情况下,您以这种方式获得了指针,您需要非常非常小心 - 不能真正使用该指针 很多,因为只要它是非托管指针(而不是托管指针),在“固定”区域或引脚之外:你不能相信对象仍然存在(它可以随时移动)
-
@MarcGravell,是的,谢谢,这是我的想法,最后我找到了所有的片段(见我的帖子答案),我现在在阅读时使用固定记忆。