C# 与 C++强强联合--C#中的指针

非常的不好意思,距离上次随笔C# 与 C++强强联合已经过去快1个月了。承诺大家的C#指针和A*算法迟迟未上。为表歉意献上美女一枚

    哈哈。流口水了吧

    话归正题。

    一、指针是什么呢?

      指针就是指针嘛!这是我的第一想法。因为我觉得这样解释已经很明确了。要更明确的话,指针是对系统使用的变量、方法在内存上的一个页签,通过指针就能找到他们。

    二、C#指针有那些应用?

      int* p表示一个变量内存地址,delegate通常用于表示对方法的引用。

    三、应用

    1、*

  1. unsafe static void Main(string[] args)
  2. {
  3. int* pa, pb;
  4. int a = 1, b = 2;
  5. pa = &a;
  6. pb = &b;
  7. Console.WriteLine(pa[0] + pb[0]);
  8. Console.ReadLine();
  9. }

    代码不解释,会不会开发的我想都懂。但是我们是C#下使用指针需要注意些什么呢?

    3.1、C#默认是不允许使用指针的,因为她任务这会增加程序的不安全性,需要我们设置下

    勾上这个,然后使用的地方需要添加unsafe。

    3.2、C#有个垃圾回收机制,为我们开发节约了很多时间,不用去管内存的释放。但是我们使用指针会遇到什么样的问题呢?我们系统变量可以分为活动变量和固定变量,固定的变量永久的存在并不会被GC的操作影响。(例如局部变量,值参数和间接指针)活动的变量会被GC重新分配位置或是释放(例如对象中的字段,基础数据数组)。如果我们使用的是活动变量这个这个会让我们的指针指的实际地址内容发生变化。这样我们需要fixed

    

  1. fixed 语句禁止垃圾回收器重定位可移动的变量
  2.  
  3. Point pt = new Point();
  4.  
  5. fixed (int* p = &pt.x)
  6. {
  7. *p = 1;
  8. }

    3.3、以前有人说C#分配数组的不是连续的内存块,今天也试了下,纯粹扯蛋。

  1.   int[] array = new int[100];
  2. for (int i = 0; i < 100; i++)
  3. {
  4. Console.WriteLine(Marshal.UnsafeAddrOfPinnedArrayElement(array, i).ToString());
  5. }
  6. Console.ReadLine();

    

    int是32位,使用4个个字节,从上面的地址看下,所以啊,是完全连接的嘛!

    3.4、暂时不知道写什么,大家补充啊!....

    二、delegate

  1.     public delegate int _DSum(int a, int b);
  2.  
  3. static void Main(string[] args)
  4. {
  5. _DSum sum = Sum;
  6. Console.WriteLine(sum(1, 2));
  7. Console.ReadLine();
  8. }
  9.  
  10. public static int Sum(int a, int b)
  11. {
  12. return a + b;
  13. }

      看上面这段代码就发现啦,我把Sum方法给_DSum的变量小sum了。这样就可以通过小sum,直接调用大Sum啦。这就是我说的方法的指针。

      常用使用情况有

      1、事件

      

  1. class Program
  2. {
  3. unsafe static void Main(string[] args)
  4. {
  5. Calculate calculate = new Calculate();   //实例Calculate
                calculate._ESum += new Calculate._DSum(calculate__ESum);  //创建_ESum事件的监听,怎么监听的呢?通过Calculate的_DSum委托,触发时执行_DSum指向的方法calculate__ESum
               Console.WriteLine(calculate.Sum(1, 2));
  6. Console.ReadLine();
  7. }
  8.  
  9. static void calculate__ESum(int a, int b)
  10. {
  11. Console.Write("{0}+{1}=", a, b);
  12. }
  13. }
  14.  
  15. public class Calculate
  16. {
  17. public delegate void _DSum(int a, int b);
  18. public event _DSum _ESum;
  19. public int Sum(int a, int b)
  20. {
  21. _ESum(a, b);
  22. return a + b;
  23. }
  24. }

    2、UI处理

    

  1. private unsafe void button1_Click(object sender, EventArgs e)
  2. {
  3. Thread t = new Thread(new ThreadStart(Bind));//创建个新线程
  4. t.Start(); //启动线程
  5. }
  6.  
  7. private void Bind()
  8. {
  9. for (int i = 0; i < 10; i++)
  10. {
  11. DShow dShow = show; //把方法show委托给dShow
  12. this.BeginInvoke(dShow, i); //在创建textBox1的句柄上去执行dShow
  13. Thread.Sleep(800);
  14. }
  15. }
  16.  
  17. private delegate void DShow(int num);
  18. private void show(int num)
  19. {
  20. textBox1.Text = num.ToString();
  21. }

    解释下为什么在创建textBox1的句柄上去执行dShow,Window是一个消息机制的操作系统,怎么说呢!就是你要执行的命名不是立马执行(当然了也可以马上执行,想游戏类不然都延迟卡死,不没法玩了)而是放到一个待执行命令的消息队列中,某个进程的一系列任务不是一个一个的去执行的,而且有线程池,可以同时并行去执行。我们的UI有个线程。为了不卡住UI,我们需要创建个新的线程。新的线程就直接去填值也是不行,线程间有安全机制。不能你操作我的东西,我操作别人的东西,这样就需要自己操作自己的。所以使用BeginInvoke。就算是自己操作自己的,我也可以等待你执行完了再执行下一个也可以不等啊。这样就有的BeginInvoke和Invoke区别了。

    

    (*^__^*) 嘻嘻,写了半天了,中间还去开了会打了下酱油。今天先这样吧!不好的大家见谅,勇敢的指出来

 
 

C# 与 C++强强联合--C#中的指针的更多相关文章

  1. 【实战Java高并发程序设计 1】Java中的指针:Unsafe类

    是<实战Java高并发程序设计>第4章的几点. 如果你对技术有着不折不挠的追求,应该还会特别在意incrementAndGet() 方法中compareAndSet()的实现.现在,就让我 ...

  2. c++中this指针的用法

    1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响sizeof(对象)的结果.this作用域是在类内部,当在类的非静态成员函数中访问类的非静态成员的时候,编译器会自动将 ...

  3. 在c#中使用指针

    如果想在c#中使用指针,首先对项目进行配置:在解决方案资源管理器中右击项目名选择属性(或在项目菜单中选择consoleApplication属性(consoleApplication为项名)),在生成 ...

  4. c中的指针

    一. 指针前奏 1. 指针的重要性 指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言. 2. 小需求 l void change(int  n)函数 ...

  5. 关于Vector中的元素中含有指针成员的情况

    对于容器,当容器的各个元素为类类型,且该类类型中含有指针成员时: 如果类类型的析构函数中包含了对指针变量指向内存的释放操作,则在利用clear()函数删除容器所有元素时,会自动调用类的析构函数,自动实 ...

  6. C++中this指针的用法详解

    转自 http://blog.chinaunix.net/uid-21411227-id-1826942.html 1. this指针的用处: 一个对象的this指针并不是对象本身的一部分,不会影响s ...

  7. C语言中的指针数组

    C语言中的指针数组是什么,像 char *a[]={"ddd","dsidd","lll"}; 这里讲一下注意如果我们使用了a也就是首元素的 ...

  8. 转: 浅谈C/C++中的指针和数组(二)

    转自:http://www.cnblogs.com/dolphin0520/archive/2011/11/09/2242419.html 浅谈C/C++中的指针和数组(二) 前面已经讨论了指针和数组 ...

  9. 转:浅谈C/C++中的指针和数组(一)

    再次读的时候实践了一下代码,结果和原文不一致 error C2372: 'p' : redefinition; different types of indirection 不同类型的间接寻址 /// ...

随机推荐

  1. Responsive Design in 3 Steps

    Responsive web design is no doubt a big thing now. If you still not familiar with responsive design, ...

  2. POJ 2492 并查集应用的扩展

    A Bug's Life Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 28651 Accepted: 9331 Descri ...

  3. 浙江大学PAT考试1009~1012(1010上帝是冠军。。)

    哎,pat1010即使java书面,只有java书面,还增加了两个点,,.啊,智商捉佳,主要pat有些不给明确的范围.造成遐想空间.. 还是按顺序介绍.. 题目地址:http://pat.zju.ed ...

  4. .NET开源项目 TOP 25

    .NET开源项目 TOP 25 如果知道.NET项目在开源中国的git上所占的比重只有5%的话,为什么这个<2014年国人开发的最热门的开源软件TOP 100>榜中.NET项目那么少就是情 ...

  5. canvas绘制自定义的曲线,以椭圆为例,通俗易懂,童叟无欺

    本篇文章,将讲述如何通过自定义的曲线函数,使用canvas的方式进行曲线的绘制. 为了通俗易懂,将以大家熟悉的椭圆曲线为例,进行椭圆的绘制.至于其他比较复杂的曲线,用户只需通过数学方式建立起曲线函数, ...

  6. PHP 13: 类

    原文:PHP 13: 类 Notice: This article is working on progress!本章将介绍PHP类.现在,基本上每种语言都支持面向对象,当然PHP也不列外.PHP在以 ...

  7. 告别alert,拥抱console

    记得学习javascript的第一个demo就是alert("Hello  World");可是学习接触javascript这么长时间了还是在alert,因为javascript调 ...

  8. leetcode第18题--Letter Combinations of a Phone Number

    Problem: Given a digit string, return all possible letter combinations that the number could represe ...

  9. How do I create an IIS application and application pool using InnoSetup script

    Create an IIS application. Create a new IIS application pool and set it's .NET version to 4. Set the ...

  10. 2014年3I工作室成员的正式名单

    后3I认真审议和审查工作室的老师及相关人员,今天,新成员首次正式发布,如以下:博才文(11软件).黄彩云(11软件).朱小丹(11软件).海(11软件).欧剑灵(11此计).黄思源(12软件).黄龙营 ...