博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#高级编程七十五天----C#使用指针
阅读量:5941 次
发布时间:2019-06-19

本文共 1811 字,大约阅读时间需要 6 分钟。

C#中使用指针的语法

假设想在C#中使用指针,首先对项目进行过配置:

 

 

 

 

 

 

看到属性了吗?单击:

 

 

 

看到那个同意不安全代码了吗?选中

 

 

然后将有关指针,地址的操作放在unsafe语句块中.使用unsafekeyword是告诉编译器这里的代码是不安全的.

 

unsafekeyword的使用:

(1)放在函数前,修饰函数,说明在函数内部或函数的形參涉及到指针操作:

unsafe static void FastCopy(byte[] src, byte[] dst, int count)

{

    // Unsafe context: can use pointers here.

}

 

不安全上下文的方位从參数列表扩展到方法的结尾,因此指针作为函数的參数时需使用unsafekeyword.

 

(2)将有关指针的操作放在由unsafe声明的不安全块中

unsafe{

//unsafe context:can use pointers here

}

 

 

案例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Csharp中使用指针

{

    class Program

    {

        static void Main(string[] args)

        {

            int i = 1;

            unsafe

            {

                Increment(&i);

            }

            Console.WriteLine(i+"\n");

 

            //演示怎样使用指针操作字符串

 

            string s = "Code Project is cool";

            Console.WriteLine("the original string : ");

            Console.WriteLine("{0}\n",s);

 

            char[] b = new char[100];

 

            //将指定书目的字符从此实例中的指定位置拷贝到Unicode字符数组的指定位置

            s.CopyTo(0, b, 0, 20);

 

 

 

            Console.WriteLine("the encode string : ");

 

            unsafe

            {

                fixed (char* p = b)

                {

                    NEncodeDecode(p); 

                }

            }

            for (int t = 0; t < 10; t++)

            {

                Console.WriteLine(b[t]);

            }

            Console.WriteLine("\n");

 

            Console.WriteLine("the decoded string : ");

 

            unsafe

            {

                fixed (char* p = b)

                {

                    NEncodeDecode(p); 

                }

            }

            for (int t = 0; t < 20; t++)

                Console.Write(b[t]);

            Console.WriteLine();

            Console.ReadKey();

        }

        unsafe public static void Increment(int* p)

        {

            *p = *p + 1;

        }

        /// <summary>

        /// 将一段字符串通过异或运算进行编码解码的操作.假设您将一段字符串送入这个

        /// 函数,这个字符串会被编码,假设将这一段已经编码的字符送入这个函数,

        /// 这段字符串就会

        /// 解码

        /// </summary>

        /// <param name="s"></param>

        unsafe public static void NEncodeDecode(char* s)

        {

            int w;

            for (int i = 0; i < 20; i++)

            {

                w = (int)*(s + i);

                w = w ^ 5;//按位异或

                *(s + i) = (char)w;

            }

        }

 

    }

}

 

 

 

当中用到了fixed,以下对其进行必要的介绍:

fixed语句仅仅能出如今不安全的上下文中,C#编译器仅仅同意fixed语句中分配指向托管变量的指针,无法改动在fixed语句中初始化的指针.

fixed语句禁止垃圾回收器重定位可移动的变量.当你在语句或函数之前使用fixed,你是告诉.net平台的垃圾回收器,在这个语句或函数运行完成前,不得回收其所占用的内存空间.

 

 

你可能感兴趣的文章
tomcat启动报错
查看>>
mybatis3单表增删改查(二)——注解方式
查看>>
【Linux基础】作业二
查看>>
SQL0332N 不支持从源代码页 "XXXX" 到目标代码页 "XXXX"
查看>>
【存储过程】从数据库中读取数据保存到文件中
查看>>
购华为第1书,写书评赢大奖
查看>>
Linux系统程序包管理工具 RPM
查看>>
朱翊:从鼎级云珍冰箱看卡萨帝的百年品牌逻辑
查看>>
进军“手机照相馆”:京东要和3C厂商干什么?
查看>>
多数大数据项目都以失败而告终的原因
查看>>
再谈MySQL JSON数据类型
查看>>
单色打印
查看>>
一生只见一次的大彗星今天来了!
查看>>
设置root密码
查看>>
SQLPLUS SPOOL命令使用详解
查看>>
成为DBA的艰辛之路————需要掌握一笔不小的知识
查看>>
根据端口 杀进程
查看>>
2、EVE-NG镜像导入(Dynamipshe和IOL)
查看>>
笔记本win7共享wifi操作说明
查看>>
如何让ssh登录时不提示"是否要添加HostKey"
查看>>