【发布时间】:2013-12-05 21:42:39
【问题描述】:
好的,这一切都是从我对哈希码的兴趣开始的。在阅读了 Jon Skeet 的一篇文章后,我问了this question。这让我对指针算术产生了浓厚的兴趣,我几乎没有这方面的经验。所以,在阅读了this page 之后,我开始进行实验,因为我从那里和我的其他出色的同龄人那里得到了初步的了解!
现在我正在做更多的实验,我相信我已经准确地复制了下面 string 实现中的哈希码循环(我保留对此有误的权利):
Console.WriteLine("Iterating STRING (2) as INT ({0})", sizeof(int));
Console.WriteLine();
var val = "Hello World!";
unsafe
{
fixed (char* src = val)
{
var ptr = (int*)src;
var len = val.Length;
while (len > 2)
{
Console.WriteLine((char)*ptr);
Console.WriteLine((char)ptr[1]);
ptr += 2;
len -= sizeof(int);
}
if (len > 0)
{
Console.WriteLine((char)*ptr);
}
}
}
但是,结果让我有点困惑;有点儿。结果如下:
Iterating STRING (2) as INT (4)
H
l
o
W
r
d
我认为,最初,ptr[1] 的值将是与第一个字母一起读取(或压扁)的第二个字母。然而,显然不是。那是因为ptr[1] 在技术上是第一次迭代的byte 4 而第二次迭代的byte 12?
【问题讨论】:
-
如果目标只是学习指针算法 - 学习 C
-
@zerkms,目的是理解指针算法,这样我就可以更好地理解微软编写的这些函数。我不想做指针运算,我只是想理解它,这样我在阅读代码时就知道它的含义。
-
如果我没记错我的指针。 “ptr”的类型为“int*”。由于 int 是一个 32 位值(4bytes) ptr[1] 应该指向 'src+(sizeof(int) * index)' 这将是字节 4。
标签: c#