C#之指针操作

  之前听人说C#没有指针,因为不安全,百度了一下是这么说的:


现在因为工作需要操作硬件看门狗,知道原来C#也是可以操作指针的。

程序环境:.NET MicroFramework   开发工具:VisualStudio 2013开发语言:C#通信工具:新生命神码工具

程序功能:我们的开发硬件在特殊外围情况下可能会出新死机现象。解决方法是通过看门狗程序发现死机,然后C#让MCU指针复位。让MCU重启。

C#操作单片机指针程序操作如下:



代码:
using System;
using Microsoft.SPOT;
using System.Threading;

namespace DoItError
{
    /// <summary>
    /// 项目属性中选择生成
    /// 生成 中勾选“允许不安全的代码”
    /// 类中标记 unsafe 修饰符 允许使用指针
    /// </summary>
    public class Program
    {
        /// <summary>搞死硬件</summary>
        public static void Main()
        {
            int a = 0;
            while (true)
            {
                a++;
                Thread.Sleep(1000);
                Debug.Print(a.ToString());

                if (a == 20)
                {
                    Debug.Print("----------执行------------");
                    new testclass().todo();
                    return;
                }
            }

        }
        public unsafe class testclass
        {
            public void todo()
            {
                //声明一个指针
                int* i;
                //为指针赋值,指向一个不存在的内存地址
                i = (int*)0x00000000;
                //获取这个指针
                var j = *i;
            }
        }
    }
}

上面的代码实现功能:计数,20秒后单片机死机,重启继续开始。

  当然C#是支持指针运算符操作的,只是为了安全VS将指针功能关闭编译,我们需要打开;

解决办法

1、设置VS 项目中“属性”→“生成” 勾选“允许不安全代码”

2、在MF程序使用指针的类上加上 unsafe 修饰符。

3、声明一个指针 int * i;为i赋值一个不存在的内存地址 i=(int *)0x00000000; 取值: var j = *i;



这样VS就支持指针编译了。

然后硬件输出。

例程下载:CSharp操作指针.rar

大热天口干舌燥的,大晚上还在敲代码的都很辛苦了。发张美女给大家降降温。

欢迎大家一起交流 ,分享程序员励志故事。   幸福的程序员 QQ群:


C#之指针操作,布布扣,bubuko.com

时间: 2024-11-05 11:49:47

C#之指针操作的相关文章

数组与指针(四)——指针操作

// ptr_ops --指针 操作 #include<stdio.h>int main(void){   int urn[5] = {100,200,300,400,500}; int *ptr1,*ptr2,*ptr3; ptr1 = urn;       //把第个地址赋给指针    ptr2 = &urn[2];   //同上 printf("pointer value ,dereferenced pointer ,pointer address:/n");

Day4:T1小技巧(类似于指针操作)T2搜索+小细节

Day4:其中有很多小技巧get T1 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一题happy,貌似也是这类型的) 这类题目第一眼总是看起来特别的不能写,其实想到了这些技巧之后很简单 感觉这也没有什么规律性或是模板可言 大概的,就是指针思想+平时积累吧 说说这一题吧 在分析正解之前,我们先说一说比较容易想到的骗分方法 设男女人数相同时ans=0,如果下一个是男->ans++,el

C 语言中有趣第指针操作(转)

http://blog.csdn.net/ghevinn/article/details/37651149(反汇编题目需要分析) 4.取出内存区域的值 在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如: void main(){ int a[2] = {261,0}; int *pi = a; char *p = (char*)pi; cout << *(int *)p++ << endl;  //取出p

C#中对指针操作报错解决方法

(C#中实际不存在指针,这里是仿C语言中指针操作进行说明) 1.错误1      “指针和固定大小缓冲区只能在不安全的上下文中使用” 解决方法:在方法前加上unsafe关键字 2.错误2 “不安全代码只会在使用 /unsafe 编译的情况下出现” 解决方法:右键选中资源管理器中项目文件--属性--生成--勾选"允许不安全代码复选框"! 事例代码,取变量a的内存地址并输出: using System; using System.Collections.Generic; using Sys

程序猿之---C语言细节27(函数无参数时细节、函数默认返回int型证明、return默认还回值、void指针++操作)

主要内容:函数无参数时细节.函数默认返回int型证明.return默认还回值.void指针++操作 一.函数无参数时细节 函数无参数时应该加上void 在c语言中一个函数 void f(); 在使用时传递参数f(2);没有报错,而在c++中则会报错 最好加上void来明确函数是无参数的 二.函数默认返回类型为int型 见下面程序 三.return默认返回1 细节:return不可返回执行栈内存中的指针,因为该内存在函数体结束时自动销毁 四.void 指针++操作 void *p; p++; //

【C++ Primer每日一刷之七】指针操作

4.2.3 指针操作 指针提供间接操纵其所指对象的功能.与对迭代器进行解引用操作一样,对指针进行解引用可访问它所指的对象,* 操作符(解引用操作符)将获取指针所指的对象: string s("hello world"); string *sp = &s; // sp holds theaddress of s cout <<*sp; // prints hello world 对 sp 进行解引用将获得 s 的值,然后用输出操作符输出该值,于是最后一条语句输出了 s

C#指针操作Marshal实例

static void Main(string[] args) { byte[] a = new byte[]{0,0,0,0}; byte[] b = new byte[] {1,2,3,4}; IntPtr pt = Marshal.AllocHGlobal(a.Length); //从source数组的startIndex下标开始复制length个对象到ptr; Marshal.Copy(b,0,pt+0,b.Length); //从ptr复制length个对象到目标数组的,从目标数组的s

数组与指针操作

一,数组 1,const int array[5] = {0, 1, 2, 3, 4}; 2,c99新特性,可以对指定的数组的某一个元素初始化.例如:int array[10] = {1, 3, [4] = 2, 6, 7, [1] = 32};如果多次对一个元素进行初始化,取最后一次的值. 3,c不支持把数组作为一个整体来赋值,也不支持用花括号括起来的列表形式进行赋值. 4,sizeof表达式被认为是一个整数常量. 5 * 5 - 1 就是整数常量表达式. 5,变长数组int array[n]

VB指针操作和消息钩子

二.VB怎么用指针 要想弄明白VB怎么使用指针,就必须要弄明白两件事,第一,如何取得数组的指针,第二,如何将指针所指向的数组取出来.     A.在讲解这两个问题之前,我们需要了解几个问题:     1.VB的数组与C++的数组的区别 有可能,大家现在认为VB的数组和C++的数组没有任何区别,都是内存中的一段地址而已,其实不然. C++中是真的数组,真的是一段地址,而且,当你的指针访问超出了数组的范围,也没人理你,只是很容易导致系统崩溃而已. 而VB数组其实是一个结构体,在这个结构体中包含了关于