原文链接: http://blog.csdn.net/shanyongxu/article/details/47321441

在C#中使用指针的语法

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

看到属性了吗?单击:

看到那个允许不安全代码了吗?选中

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

unsafe关键字的使用:

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

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

{

// Unsafe context: can use pointers here.

}

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

(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平台的垃圾回收器,在这个语句或函数执行完毕前,不得回收其所占用的内存空间.

C#编程(七十五)----------C#使用指针的更多相关文章

  1. C#高级编程七十五天----C#使用指针

    在C#中使用指针的语法 假设想在C#中使用指针,首先对项目进行过配置: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/font ...

  2. 孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5

    孤荷凌寒自学python第七十五天开始写Python的第一个爬虫5 (完整学习过程屏幕记录视频地址在文末) 今天在上一天的基础上继续完成对我的第一个代码程序的书写. 直接上代码.详细过程见文末屏幕录像 ...

  3. 第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表、课程机构表、讲师表

    第三百七十五节,Django+Xadmin打造上线标准的在线教育平台—创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课 ...

  4. “全栈2019”Java第七十五章:内部类持有外部类对象

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 学习ASP.NET Core Razor 编程系列十五——文件上传功能(三)

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  6. 并发编程(十五)——定时器 ScheduledThreadPoolExecutor 实现原理与源码深度解析

    在上一篇线程池的文章<并发编程(十一)—— Java 线程池 实现原理与源码深度解析(一)>中从ThreadPoolExecutor源码分析了其运行机制.限于篇幅,留下了Scheduled ...

  7. 《手把手教你》系列基础篇(七十五)-java+ selenium自动化测试-框架设计基础-TestNG实现DDT - 中篇(详解教程)

    1.简介 上一篇中介绍了DataProvider如何传递参数,以及和一些其他方法结合传递参数,今天宏哥接着把剩下的一些常用的也做一下简单的介绍和分享. 2.项目实战1 @DataProvider + ...

  8. C#编程(七十六)----------使用指针实现基于栈的高性能数组

    使用指针实现基于栈的高性能数组 以一个案例为主来分析实现方法: using System; using System.Collections.Generic; using System.Linq; u ...

  9. Python excel文件操作,编程练习题实例七十五

    纯文本文件 student.txt为学生信息, 里面的内容(包括花括号)如下所示: { "1":["张三",150,120,100], "2" ...

随机推荐

  1. mac安装RabbitMQ

    1 下载 地址 http://www.rabbitmq.com/install-standalone-mac.html 2 rabbitmq的安装目录: /Users/ysyc1/rabbitmq_s ...

  2. IntelliJ IDEA使用教程

    注:本文来源:李学凯 的<IntelliJ IDEA使用教程 (总目录篇)> 一:(总目录篇)_1:硬件要求 IntelliJ IDEA 对硬件的要求看上去不是很高.可是实际在开发中其实并 ...

  3. python+selenium一:对浏览器的操作

    # 1.打开Firefox浏览器from selenium import webdriverdriver = webdriver.Firefox()driver.get("https://w ...

  4. python 全栈开发,Day76(Django组件-cookie,session)

    昨日内容回顾 1 json 轻量级的数据交换格式 在python 序列化方法:json.dumps() 反序列化方法:json.loads() 在JS中: 序列化方法:JSON.stringfy() ...

  5. HttpClient + Testng实现接口测试

    HttpClient教程 : https://www.yeetrack.com/?p=779 一,所需要的环境: 1,testng .httpclient和相关的依赖包 二.使用HttpClient登 ...

  6. DDD领域模型之分配权限(十三)

    权限分配和权限查找. 在DDD.Domain工程中新建:BAS_PermissionAssign类 public partial class BAS_PermissionAssgin:Aggreate ...

  7. c3p0和QueryRunner的结合使用,让开发更加简便

    1:DBUtils中的QueryRunner的使用: 1.1:QueryRunner中提供了对SQL语句操作的api: 1.2:主要有三个方法: 1.2.1:query():用于执行select(查询 ...

  8. 多线程中实现ApplicationContextAware接口获取需要的bean,applicationContext.getBea未返回也未报错

    唉,面试失败了有点难过. https://q.cnblogs.com/q/95168/#a_208239

  9. 【BZOJ2839】集合计数&&【BZOJ3622】已经没有什么好害怕的了

    再谈容斥原理来两道套路几乎一致的题目[BZOJ2839]集合计数Description一个有N个元素的集合有2^N个不同子集(包含空集),现在要在这2^N个集合中取出若干集合(至少一个),使得它们的交 ...

  10. BZOJ4972 八月月赛 Problem B 小Q的方格纸 二维前缀和

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4972 八月月赛Problem B 题目概括 一个矩阵,一坨询问,问矩阵中一个特定方向的等腰直角三角 ...