返回顶部
首页 > 资讯 > 精选 >C#指针变量与unsafe如何实现
  • 207
分享到

C#指针变量与unsafe如何实现

2023-07-05 20:07:42 207人浏览 独家记忆
摘要

这篇文章主要介绍“C#指针变量与unsafe如何实现”,在日常操作中,相信很多人在C#指针变量与unsafe如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#指针变量与unsafe如何实现”的疑惑有所

这篇文章主要介绍“C#指针变量与unsafe如何实现”,在日常操作中,相信很多人在C#指针变量与unsafe如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#指针变量与unsafe如何实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为了保持类型的安全性,默认情况下 C# 是不支持指针的,但是如果使用 unsafe 关键字来修饰类或类中的成员,这样的类或类中成员就会被视为不安全代码,C# 允许在不安全代码中使用指针变量。在公共语言运行时 (CLR) 中,不安全代码是指无法验证的代码,不安全代码不一定是危险的,只是 CLR 无法验证该代码的安全性。因此 CLR 仅会执行信任程序集中包含的不安全代码。

指针变量

在 C# 中,指针同样是一个变量,但是它的值是另一个变量的内存地址,在使用指针之前我们同样需要先声明指针,声明指针的语法格式如下所示:

type* var_name;

下表中列举了一些定义指针的示例:

示例说明
int* pp 是指向整数的指针
double* pp 是指向双精度数的指针
float* pp 是指向浮点数的指针
int** pp 是指向整数的指针的指针
int*[] pp 是指向整数的指针的一维数组
char* pp 是指向字符的指针
void* pp 是指向未知类型的指针

与声明变量相同,我们同样可以在一行代码中同时声明多个指针,如下所示:

int* p1, p2, p3;  // 定义 p1、p2、p3 三个整数指针

注意:指针类型不能从对象中继承,并且装箱和拆箱也不支持指针,但是不同的指针类型以及指针与整型之间可以进行转换。

【示例】下面通过示例演示 C# 中 unsafe 关键字和指针的使用:

using System;namespace jb51.net{    class Demo    {        static unsafe void Main(string[] args)        {            double f = 3.1415;            double* p = &f;            Console.WriteLine("数据的内容是: {0} ",  f);            Console.WriteLine("数据在内存中的地址是: {0}",  (int)p);            Console.ReadKey();        }    }}

运行结果如下:

字符串的内容是: 3.1415
字符串在内存中的地址是: 11530344

提示:在编译上述代码时需要在编译命令中添加-unsafe,例如csc -unsafe demo.cs。

使用指针检索数据的值

在 C# 中,我们可以使用 ToString() 来获取指针变量所指向的数据的值,如下例所示:

using System;namespace jb51.net{    class Demo    {        public static void Main()        {            unsafe            {                int var = 123456;                int* p = &var;                Console.WriteLine("变量 var 的值为: {0} " , var);                Console.WriteLine("指针 p 指向的值为: {0} " , p->ToString());                Console.WriteLine("指针 p 的值为: {0} " , (int)p);            }            Console.ReadKey();        }    }}

运行结果如下:

变量 var 的值为: 123456
指针 p 指向的值为: 123456
指针 p 的值为: 13889084

将指针作为参数传递给函数

我们可以将指针变量作为参数传递给函数,如下例所示:

using System;namespace jb51.net{    class Demo    {        public unsafe void swap(int* p, int *q)        {            int temp = *p;            *p = *q;            *q = temp;        }        public unsafe static void Main()        {            Demo p = new Demo();            int var1 = 10;            int var2 = 20;            int* x = &var1;            int* y = &var2;            Console.WriteLine("调用 Swap 函数前: var1:{0}, var2: {1}", var1, var2);            p.swap(x, y);            Console.WriteLine("调用 Swap 函数后: var1:{0}, var2: {1}", var1, var2);            Console.ReadKey();        }    }}

运行结果如下:

调用 Swap 函数前: var1:10, var2: 20
调用 Swap 函数后: var1:20, var2: 10

使用指针访问数组元素

在 C# 中,数组和指向该数组且与数组名称相同的指针是不同的数据类型,例如int* p和int[] p就是不同的数据类型。您可以增加指针变量 p 的值,因为它在内存中不是固定的,但数组地址在内存中是固定的,因此您不能增加数组 p 的值。如果您需要使用指针变量访问数组数据,可以像我们在 C 或 c++ 中所做的那样,使用 fixed 关键字来固定指针。下面通过示例演示一下:

using System;namespace jb51.net{    class Demo    {        public unsafe static void Main()        {            int[]  list = {10, 100, 200};            fixed(int *ptr = list)                        for ( int i = 0; i < 3; i++)            {                Console.WriteLine("list[{0}] 的内存地址为:{1}",i,(int)(ptr + i));                Console.WriteLine("list[{0}] 的值为:{1}", i, *(ptr + i));            }            Console.ReadKey();        }    }}

运行结果如下:

list[0] 的内存地址为:51981272
list[0] 的值为:10
list[1] 的内存地址为:51981276
list[1] 的值为:100
list[2] 的内存地址为:51981280
list[2] 的值为:200

编译不安全代码

为了编译不安全代码,在编译时必须使用unsafe命令,例如编译包含不安全代码的 demo.cs 程序的命令如下所示:

csc /unsafe demo.cs

csc -unsafe demo.cs

如果您使用的是 Visual Studio,那么您需要在项目属性中启用不安全代码,具体步骤如下:

  • 通过双击资源管理器(Solution Explorer)中的属性(properties)节点,打开项目属性(project properties);

  • 点击 Build 标签页;

  • 选择选项“Allow unsafe code”。

到此,关于“C#指针变量与unsafe如何实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: C#指针变量与unsafe如何实现

本文链接: https://lsjlt.com/news/354855.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#指针变量与unsafe如何实现
    这篇文章主要介绍“C#指针变量与unsafe如何实现”,在日常操作中,相信很多人在C#指针变量与unsafe如何实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#指针变量与unsafe如何实现”的疑惑有所...
    99+
    2023-07-05
  • C#指针变量与unsafe的实现
    目录指针变量使用指针检索数据的值将指针作为参数传递给函数使用指针访问数组元素编译不安全代码为了保持类型的安全性,默认情况下 C# 是不支持指针的,但是如果使用 unsafe 关键字来...
    99+
    2023-05-14
    C#指针变量 C# unsafe
  • c语言指针变量如何定义
    在C语言中,指针变量可以通过在变量名前面加上"*"符号来定义。例如,定义一个整型指针变量可以这样写: int *...
    99+
    2024-04-09
    c语言
  • C语言如何实现枚举与指针
    这篇文章主要介绍“C语言如何实现枚举与指针”,在日常操作中,相信很多人在C语言如何实现枚举与指针问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言如何实现枚举与指针”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-16
  • 如何理解C++指针常量和常量指针
    目录术语常量指针(pointer to const)指针常量(指针)前言: 应该怎样正确的姿势去理解指针常量和常量指针,到我发布这篇文章时候,感觉自己对指针常量和常量指针理解还是不够...
    99+
    2024-04-02
  • C语言入门篇--初识指针和指针变量
    1.指针 指针就是地址(即一个数据)。 2.指针变量 2.1概念 (1)指针变量是变量,是变量在内存中就会开辟空间,会有自己对应的的地址,有自己的变量大小。 (2)指针变量里放的内容...
    99+
    2024-04-02
  • C++中指针常量与常量指针的区别是什么
    在C++中,指针常量和常量指针是不同的概念。1. 指针常量(Pointer to constant):指针本身是一个常量,即指针的值...
    99+
    2023-08-16
    C++
  • C++常量与指针怎么用
    本文小编为大家详细介绍“C++常量与指针怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++常量与指针怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言和指针联用有佷微妙的地方,之前一直佷晕,现在来...
    99+
    2023-06-27
  • 简单总结C++中指针常量与常量指针的区别
    C++中指针常量与常量指针有以下区别:1. 指针常量(Pointer to constant):指针常量是一个指针,它的值是一个常量...
    99+
    2023-08-15
    C++
  • c语言中字符串变量如何用指针指向第一位
    通过指针指向 c 语言字符串变量的第一位步骤如下:声明一个字符指针变量。将指针变量赋值为字符串变量的地址,可以使用取地址运算符 (&)。 如何用指针指向 C 语言字符串变量的第...
    99+
    2024-05-22
    c语言
  • C语言中关于指针变量的坑
    先看一个初始化带头结点单链表的例子,LNode是结点变量,LinkList是结点指针变量,等同于LNode* typedef struct LNode{ // 定义单链表节点类...
    99+
    2024-04-02
  • C语言如何使用数组指针与函数指针
    这篇文章主要为大家展示了“C语言如何使用数组指针与函数指针”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言如何使用数组指针与函数指针”这篇文章吧。函数指针语法定义一个函数指针,并通过函数指针...
    99+
    2023-06-29
  • C语言中如何实现二级指针
    今天小编给大家分享一下C语言中如何实现二级指针的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。C语言中二级指针的实例详解用图说...
    99+
    2023-06-17
  • 如何进行C++智能指针的实现
    本篇文章为大家展示了如何进行C++智能指针的实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。自己根据http://blog.csdn.net/lf_2016/article/details/524...
    99+
    2023-06-06
  • C语言宏与指针如何使用
    这篇文章主要讲解了“C语言宏与指针如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言宏与指针如何使用”吧!1、关于definedefine是一个预处理指令,有两种用法,一种是用de...
    99+
    2023-07-02
  • C语言指针变量作为函数参数的实现步骤详解
    目录函数参数用数组作函数参数函数参数 在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使...
    99+
    2023-02-11
    C语言指针变量作为函数参数 C语言指针变量 C语言函数参数
  • C#指针的实现方法
    本篇内容介绍了“C#指针的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 指针类型可以是实体变量(int,double)也可以是...
    99+
    2023-06-18
  • C++野指针和悬空指针的实现方法
    目录一、野指针二、悬空指针2.1 情况一2.2 情况二2.3 情况三野指针和悬空指针是指针中常见的两个概念,本文结合实例讲解来讲解下。 一、野指针 野指针是指尚未初始化的指针,既不...
    99+
    2024-04-02
  • 怎么用C++实现野指针和悬空指针
    本篇内容主要讲解“怎么用C++实现野指针和悬空指针”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C++实现野指针和悬空指针”吧!目录一、野指针二、悬空指针1 情况一2 情况二3 情况三野指...
    99+
    2023-06-20
  • C++智能指针shared_ptr与weak_ptr的实现分析
    目录shared_ptrweak_ptr内存模型RefCnt 和 Mdel实现shared_ptr 实现weak_ptr 实现shared_from_this()循环引用shared...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作