Mik*_*oud 1 c# pointers pointer-arithmetic
请考虑以下代码:
static void Main(string[] args)
{
int max = 1024;
var lst = new List<int>();
for (int i = 1; i <= max; i *= 2) { lst.Add(i); }
var arr = lst.ToArray();
IterateInt(arr);
Console.WriteLine();
IterateShort(arr);
Console.WriteLine();
IterateLong(arr);
}
static void IterateInt(int[] arr)
{
Console.WriteLine("Iterating as INT ({0})", sizeof(int));
Console.WriteLine();
unsafe
{
fixed (int* src = arr)
{
var ptr = (int*)src;
var len = arr.Length;
while (len > 0)
{
Console.WriteLine(*ptr);
ptr++;
len--;
}
}
}
}
static void IterateShort(int[] arr)
{
Console.WriteLine("Iterating as SHORT ({0})", sizeof(short));
Console.WriteLine();
unsafe
{
fixed (int* src = arr)
{
var ptr = (short*)src;
var len = arr.Length;
while (len > 0)
{
Console.WriteLine(*ptr);
ptr++;
len--;
}
}
}
}
static void IterateLong(int[] arr)
{
Console.WriteLine("Iterating as LONG ({0})", sizeof(long));
Console.WriteLine();
unsafe
{
fixed (int* src = arr)
{
var ptr = (long*)src;
var len = arr.Length;
while (len > 0)
{
Console.WriteLine(*ptr);
ptr++;
len--;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我绝不会在这个舞台上有充分的理解.我也没有任何真正的期望.我正在尝试并尝试学习.然而,根据关什么我迄今读,我不明白,我得到的结果short和long.
据我所知,原始的int[],当一次读取1个位置(即arr + i)时,4由于数据类型的大小,一次读取字节,因此该值*ptr当然是整数值.
但是,short我不太明白为什么每个偶数迭代都是0(或者可以说是奇怪的迭代,具体取决于你的根参考).我的意思是我可以看到模式.每次迭代4个字节时,我都会在内存中得到真正的积分值(就像迭代一样int*),但是为什么0每个其他结果呢?
然后long迭代甚至超出了我的理解; 我甚至不知道该说什么或假设在那里.
Iterating as INT (4)
1
2
4
8
16
32
64
128
256
512
1024
Iterating as SHORT (2)
1
0
2
0
4
0
8
0
16
0
32
Iterating as LONG (8)
8589934593
34359738372
137438953488
549755813952
2199023255808
-9223372036854774784
96276819136
32088581144313929
30962698417340513
32370038935650407
23644233055928352
Run Code Online (Sandbox Code Playgroud)
什么是真正与发生short和long反复?
当你说它pointer[index]给你sizeof(type)位置的字节pointer + index * sizeof(type).因此,通过更改"迭代"的类型,您可以更改步幅.
short你看过原著的一半int的.小的上半部分全部为零.long你同时阅读两个int人的同时,强迫一个人long.在ptr[0]你正在阅读,例如,(1L << 32 | 2L)这是一个大数目.但是,您仍在使用Length以int为单位测量的原始值,这是一个错误.在long-case中,您正在读取数组的边界之外,short如果您阅读的内容太少.