文谷首页 | 业界传真 | 网络技术 | 服务器 | 数据库 | 存储技术 | 系统安全 | 无线技术 | Cisco | .Net | Windows | Linux | Unix | Java
电子商务 | 网站工程 | 网页设计 | 平面设计 | 多媒体 | 编程语言 | Oracle | MSSQL | Photoshop | ASP | PHP | 实用技巧 | 进程查询 | 文谷论坛
.NET频道
 资讯动态   ASP.NET   C#   ADO.NET   VC.NET   VB.NET   .NET Framework   WebService
您现在的位置: IT文谷 >> 开发平台 >> .net framework >> C# >> 文章正文
详细解说C#里使用指针详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针
详细解说C#里使用指针
详细解说C#里使用指针详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针
详细解说C#里使用指针详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针
      指针在C\C++里面可是一个好东西,但是到java,.net的时代指针已经被封装起来,对用户不可见,这点java做的非常的彻底。.net可能因为还存在一个托管C++,因此指针并没有完全废除,C#还是保留了指针的操作。        要使用指针首先要对使用指针的代码用unsafe进行进行声明,声明和public声明一样,可以对整个类进行声明,也可以是类里面某个方法或者属性。在代码里什么后,还需要修改工程项目的Build属性,让编译器支持指针的操作。        做好事前的工作就可以使用指针了。指针的使用方法和C++下使用没有太多差别。只要编译器不报错就没有太大问题。        下面是对指针的一些使用上的理解: 1.  指针类型可以是实体变量(int,double)也可以是enum,同时也支持结构体变量struct。但不能是类。不过空指针可以指向类,只不过空指针不能进行任何操作,也只能把空指针作为传递对象来使用。 2. C#提供一个的关键字stackalloc用于申请堆栈内存。注意,这个申请内存分配的是栈内存,当函数执行完毕后,内存会被自动回收。不过我想用这个栈内存基本可以解决40%的问题,而且使用的时候不必担心内存泄漏问题。 3. .net 好像不直接支持堆内存的申请(这个对.net来说很危险),不过我们可以通过调用win32 api 的方法进行申请。这样就可以解决剩下40%的问题。堆内存申请的方法在MSDN里面有相关的文档,具体实现代码见附1。 4.  结构体是一个特殊的对象。他与类的定义就差一个关键字,使用方法也和类一样,可以定义属性,可以定义方法。但是在进行指针操作的时候双方就有很大的差别了。结构体可以通过sizeof()取得大小,大小与结构体里有多少实体变量有关,但是如果struck里定义了类的对象,或者指针,sizeof可能会编译不过(void* 的空指针例外,不过需要在结构体声明处加上unsafe)。 5. fixed关键字:目前了解的不多,不过有一个很实用的例子可以让指针能够和.net里的数组进行交互操作:                   byte[] buffer = new byte[100];                 fixed (byte* p = buffer)                 {                     P[0] = 123;                     ……                 }   6.  其它 7.           附1:     public unsafe class Memory     {         // Handle for the process heap. This handle is used in all calls to the         // HeapXXX APIs in the methods below.         static int ph = GetProcessHeap();         // Private instance constructor to prevent instantiation.         private Memory() { }         // Allocates a memory block of the given size. The allocated memory is         // automatically initialized to zero.         public static void* Alloc(int size)         {             void* result = HeapAlloc(ph, HEAP_ZERO_MEMORY, size);             if (result == null) throw new OutOfMemoryException();             return result;         }         // Copies count bytes from src to dst. The source and destination         // blocks are permitted to overlap.         public static void Copy(void* src, void* dst, int count)         {             byte* ps = (byte*)src;             byte* pd = (byte*)dst;             if (ps > pd)             {                 for (; count != 0; count--) *pd++ = *ps++;             }             else if (ps < pd)             {                 for (ps += count, pd += count; count != 0; count--) *--pd = *--ps;             }         }         // Frees a memory block.         public static void Free(void* block)         {             if (!HeapFree(ph, 0, block)) throw new InvalidOperationException();         }         // Re-allocates a memory block. If the reallocation request is for a         // larger size, the additional region of memory is automatically         // initialized to zero.         public static void* ReAlloc(void* block, int size)         {             void* result = HeapReAlloc(ph, HEAP_ZERO_MEMORY, block, size);             if (result == null) throw new OutOfMemoryException();             return result;         }         // Returns the size of a memory block.         public static int SizeOf(void* block)         {             int result = HeapSize(ph, 0, block);             if (result == -1) throw new InvalidOperationException();             return result;         }         // Heap API flags         const int HEAP_ZERO_MEMORY = 0x00000008;         // Heap API functions         [DllImport("kernel32")]         static extern int GetProcessHeap();         [DllImport("kernel32")]         static extern void* HeapAlloc(int hHeap, int flags, int size);         [DllImport("kernel32")]         static extern bool HeapFree(int hHeap, int flags, void* block);         [DllImport("kernel32")]         static extern void* HeapReAlloc(int hHeap, int flags,            void* block, int size);         [DllImport("kernel32")]         static extern int HeapSize(int hHeap, int flags, void* block);     }

详细解说C#里使用指针详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针
  • 上一篇文章:

  • 下一篇文章:
  • 进入论坛讨论

    相关文章
    c#中通过值和引用传递参数
    一个相当独立的通用分页控件c#源码
    病毒及流氓软件自我复制的简单实现
    C#中Dispose和Close的区别
    C#:从资源文件里加载文件
    利用C#实现分布式数据库查询
    C#.NET windows控件实现水印
    C#纯数学方法递归实现货币数字转换中文
    c#中什么情况下用Convert.ToInt32?
    是Attribute,还是Property?
    使用 Flex 上传文件
    基于.Net平台唯一运行实例C#代码实现
    热门文章最新推荐

    版权与免责声明:
    ① 本网转载其他媒体稿件是为传播更多的信息,此类稿件不代表本网观点,版权归原作者所有,本网不承担此类稿件侵权行为的连带责任。
    ② 本站原创文章,转载时请注明出自文谷及作者姓名
    ③在本网BBS上发表言论者,文责自负。
    ④如您因版权等问题需要与本网联络,请在30日内联系 。
    详细解说C#里使用指针详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针
    详细解说C#里使用指针详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针2007-1-28 12:09:17详细解说C#里使用指针

    全站热点
    最新推荐
    关于文谷 | 联系文谷 | 免责声明 | 文谷论坛
    Tel: 0577-65690019      E-mail: ichenjian@gmail.com    MSN:ichenjian@hotmail.com    QQ:2911194
    Copyright © 2004-2008 wengu.com 文谷 All Rights Reserved
    浙ICP备05000327号