C#编程(七十五)----------C#使用指针

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

时间: 2024-12-20 16:22:16

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

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

在C#中使用指针的语法 假设想在C#中使用指针,首先对项目进行过配置: 看到属性了吗?单击: 看到那个同意不安全代码了吗?选中 然后将有关指针,地址的操作放在unsafe语句块中.使用unsafekeyword是告诉编译器这里的代码是不安全的. unsafekeyword的使用: (1)放在函数前,修饰函数,说明在函数内部或函数的形參涉及到指针操作: unsafe static void FastCopy(byte[] src, byte[] dst, int count) { // Unsaf

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

第三百七十五节,Django+Xadmin打造上线标准的在线教育平台-创建课程机构app,在models.py文件生成3张表,城市表.课程机构表.讲师表 创建名称为app_organization的课程机构APP,写数据库操作文件models.py models.py文件 #!/usr/bin/env python # -*- coding:utf-8 -*- from __future__ import unicode_literals from datetime import datetim

shell编程(十五)--- while特殊用法和函数

break:退出循环体 continue:结束本次循环,进入下一次循环. while特殊用法1: while : do done 上述为while的死循环. while特殊用法2: while read LINE do done < /path/to/FILE 作用:通过while读取FILE文件中的每一行,并将其保存在变量LINE中. 函数:function 语法格式: 方法1: function FUNCTIONNAME {     COMMAND } 方法2: FUNCTIONNAME()

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

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第七十五章:内部类持有外部类对象 下一章 "全栈2019"Java第七十六章:静态.非静态内部类访问权限 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习

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

使用指针实现基于栈的高性能数组 以一个案例为主来分析实现方法: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 基于堆栈的数组 { class Program { static void Main(string[] args) { int[] i = new int[10]; Console.W

一起talk C栗子吧(第一百七十五回:C语言实例--获取当前终端的行数和列数)

各位看官们,大家好,上一回中咱们说的是关闭终端中缓冲功能的例子,这一回咱们说的例子是:获取当前终端的行数和列数 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了termios相关的信息,以及termios提供的编程接口,通过这些接口可以操作终端,今天我们再介绍一些操作终端的编程接口,通过这些接口可以获取当前终端的行数和列数,这便是我们今天的主题. int setupterm(char *term, int fd, int *errret); 该函数用来修改当前

Java编程思想(十五) —— 类型信息之反射

讲完.class,Class之后,继续. 1)泛化的Class引用 Class也可以加入泛型,加入之后会进行类型检查. 贴一下书上原话,Class<?>优于Class,虽然他们是等价的,Class<?>的好处是碰巧或疏忽使用了一个非具体的类引用.我搞不懂这个所谓非具体是什么? 后面弄懂了,其实<?>作为通配符,就是未知的,直接写结论的话不能写个具体类型吧,作者的意思其实就是说加了泛型的Class就是选择了非具体的版本. 加入泛型的原因是提供编译期间的类型检查,操作失误的

第七十五节,CSS表格与列表

CSS表格与列表 学习要点: 1.表格样式 2.列表样式 3.其他功能 一.表格样式 表格有五种独有样式,样式表如下:             属性               值                   说明              CSS版本       border-collapse        边框样式    相邻单元格的边框样式                         2        border-spacing       长度值        相邻单元格边

Linux学习总结(七十五)非关系型数据库之memcached

一 非关系型数据库 非关系型数据库就是NoSQL,关系型数据库代表MySQL对于关系型数据库来说,是需要把数据存储到库.表.行.字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索NoSQL数据库存储原理非常简单(典型的数据类型为k-v),不存在繁杂的关系链,比如mysql查询的时候,需要找到对应的库.表(通常是多个表)以及字段.NoSQL数据可以存储在内存里,查询速度非常快NoSQL在性能表现上虽然能优于关系型数据库,但是它并不能完全替