`
onlyadou
  • 浏览: 8677 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
最近访客 更多访客>>
社区版块
存档分类
最新评论

使用指针复制字节数组

阅读更多
下面的示例使用指针将字节从一个数组复制到另一个使用指针的数组。

此示例使用 unsafe 关键字,它允许在 Copy 方法内使用指针。fixed 语句用于声明指向源数组和目标数组的指针。这将锁定源数组和目标数组在内存中的位置,使其不会因为垃圾回收操作而移动。这些内存块将在 fixed 块结束时取消锁定。因为本示例中 Copy 函数使用了 unsafe 关键字,它必须使用 /unsafe 编译器选项进行编译。

[code= "c#"]
// compile with: /unsafe

class TestCopy
{
    // The unsafe keyword allows pointers to be used within the following method:
    static unsafe void Copy(byte[] src, int srcIndex, byte[] dst, int dstIndex, int count)
    {
        if (src == null || srcIndex < 0 ||
            dst == null || dstIndex < 0 || count < 0)
        {
            throw new System.ArgumentException();
        }

        int srcLen = src.Length;
        int dstLen = dst.Length;
        if (srcLen - srcIndex < count || dstLen - dstIndex < count)
        {
            throw new System.ArgumentException();
        }

        // The following fixed statement pins the location of the src and dst objects
        // in memory so that they will not be moved by garbage collection.
        fixed (byte* pSrc = src, pDst = dst)
        {
            byte* ps = pSrc;
            byte* pd = pDst;

            // Loop over the count in blocks of 4 bytes, copying an integer (4 bytes) at a time:
            for (int i = 0 ; i < count / 4 ; i++)
            {
                *((int*)pd) = *((int*)ps);
                pd += 4;
                ps += 4;
            }

            // Complete the copy by moving any bytes that weren't moved in blocks of 4:
            for (int i = 0; i < count % 4 ; i++)
            {
                *pd = *ps;
                pd++;
                ps++;
            }
        }
    }

    static void Main()
    {
        byte[] a = new byte[100];
        byte[] b = new byte[100];

        for (int i = 0; i < 100; ++i)
        {
            a[i] = (byte)i;
        }

        Copy(a, 0, b, 0, 100);
        System.Console.WriteLine("The first 10 elements are:");

        for (int i = 0; i < 10; ++i)
        {
            System.Console.Write(b[i] + " ");
        }
        System.Console.WriteLine("\n");
    }
}



输出
The first 10 elements are:
0 1 2 3 4 5 6 7 8 9
分享到:
评论

相关推荐

    C# 程序设计手册(WORD)

    使用指针复制字节数组 432 XML 文件批注 434 建议使用的文件批注标签 435 处理 XML 档案 448 文件标签的分隔符 453 使用 XML 文件功能 454 应用程序域 458 在其他应用程序域中执行程序代码 459 建立和使用应用程序域...

    C语言程序设计题库 第九章:指针

    但使用指针就可以很好的避免这个问题,因为任何类型的指针占用的字节数都是一样的(根据平台不同,有4字节或者8字节或者其他可能)。 第二,指针使得一些复杂的链接性的数据结构的构建成为可能,比如链表,链式...

    VB 做的相册(缩略图预览程序)

     lpBits:指向字节类型数组的指针?该数组中包含了指定位图的颜色数据?  返回值:如果该函数执行成功,则返回值就是在设置位图位时使用的字节数;如果失败,则返回值为0。    函数功能:该函数得到指定图形对象...

    自定义数据类型与字节集互转-易语言

    设置成员类型的文本,是从这里复制的文本 字节集组成 1字节 #字节型 2字节 #短整数型 4字节 #整数型 8字节 #长整数型 4字节 #小数型 ...数组型的自定义类型:前4字节是数组成员数,其他的和上面一样

    你必须知道的495个C语言问题

    到底指针是一种数组,还是数组是一种指针? 6.11 我看到一些“搞笑”的代码,包含5["abcdef"]这样的“表达式”。这为什么是合法的C语言表达式呢? 数组的指针 6.12 既然数组引用会退化为指针,如果array是数组...

    ImHex软件.zip

    复制字节作为特征 字节 十六进制字符串 C、C++、C#、Rust、Python、Java 和 JavaScript 数组 ASCII-Art 十六进制视图 HTML 自包含 div 字符串和十六进制搜索 多彩高亮 从开始、结束和当前光标位置转到 用于解析突出...

    c语言经典案例

    实例168 使用指针输出数组元素 238 实例169 使用指针查找数列中的 最大值和最小值 240 实例170 使用指针的指针输出字符串 241 实例171 使用指向指针的指针对 字符串排序 242 实例172 使用返回指针的函数查找 最大值 ...

    Visual C++开发经验技巧宝典(第1章)

    0035 使用指针数组 13 0036 函数指针数组的应用 13 0037 函数重载的注意事项 14 0038 使用typename关键字 14 1.4 引用 14 0039 使函数返回多个值 14 0040 如何使用引用 15 0041 如何应用值传递参数 ...

    《你必须知道的495个C语言问题》

    书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别给出了解答,而且结合代码示例阐明要点。 《你必须知道的495个C语言问题》结构...

    清华大学计算机课程之《C++程序设计》

    - 第一节 指针变量的定义与使用 - 第二节 动态内存分配 - 第三节 指针运算 - 第四节 指针与常量 - 第五节 指针作函数参数 - 第六节 指针与数组 - 第七节 函数指针 - 第八节 引用 - 第九节 Typedef - 第...

    java源码包2

     Java生成密钥、保存密钥的实例源码,通过本源码可以了解到Java如何产生单钥加密的密钥(myKey)、产生双钥的密钥对(keyPair)、如何保存公钥的字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

    C语言FAQ 常见问题列表

    o 7.9 既然数组引用会蜕化为指针, 如果 arr 是数组, 那么 arr 和 &arr 又有什么区别呢 ? o 7.10 我如何声明一个数组指针 ? o 7.11 我如何在运行期设定数组的大小 ? 我怎样才能避免固定大小的数组 ? o 7.12 ...

    易语言用写的支持库

    易语言用写的支持库源码,用写的支持库,功能函数,通知信息函数,GetNewInf,调用函数接口,取字节集指针,取文本指针,取变量指针,复制参数信息,复制命令信息,复制常量信息,取参数类型,取数组参数成员数,取参数指针,取整数...

    C函数之memcpy()函数用法

     由src指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。  头文件  #include  返回值  函数返回一个指向dest的指针。  说明  1.source和destin所指内存区域不能重叠...

Global site tag (gtag.js) - Google Analytics