具有不同类型的指针算法并理解结果?

 大伟 发布于 2023-02-12 19:15

请考虑以下代码:

static void Main(string[] args)
{
    int max = 1024;
    var lst = new List();
    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--;
            }
        }
    }
}

现在,我绝不会在这个舞台上有充分的理解.我也没有任何真正的期望.我正在尝试并尝试学习.然而,根据关什么我迄今读,我不明白,我得到的结果shortlong.

据我所知,原始的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

什么是真正与发生shortlong反复?

1 个回答
  • 当你说它pointer[index]给你sizeof(type)位置的字节pointer + index * sizeof(type).因此,通过更改"迭代"的类型,您可以更改步幅.

    随着short你看过原著的一半int的.小的上半部分全部为零.

    long你同时阅读两个int人的同时,强迫一个人long.在ptr[0]你正在阅读,例如,(1L << 32 | 2L)这是一个大数目.

    但是,您仍在使用Length以int为单位测量的原始值,这是一个错误.在long-case中,您正在读取数组的边界之外,short如果您阅读的内容太少.

    2023-02-12 19:16 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有