熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

詳細解說C#裡使用指針

2013-11-13 10:17:00  來源: .NET編程 
      指針在C\C++裡面可是一個好東西但是到的時代指針已經被封裝起來對用戶不可見這點java做的非常的徹底可能因為還存在一個托管C++因此指針並沒有完全廢除C#還是保留了指針的操作
       要使用指針首先要對使用指針的代碼用unsafe進行進行聲明聲明和public聲明一樣可以對整個類進行聲明也可以是類裡面某個方法或者屬性在代碼裡什麼後還需要修改工程項目的Build屬性讓編譯器支持指針的操作
       做好事前的工作就可以使用指針了指針的使用方法和C++下使用沒有太多差別只要編譯器不報錯就沒有太大問題
       下面是對指針的一些使用上的理解
.  指針類型可以是實體變量(intdouble)也可以是enum同時也支持結構體變量struct但不能是類不過空指針可以指向類只不過空指針不能進行任何操作也只能把空指針作為傳遞對象來使用
. C#提供一個的關鍵字stackalloc用於申請堆棧內存注意這個申請內存分配的是棧內存當函數執行完畢後內存會被自動回收不過我想用這個棧內存基本可以解決%的問題而且使用的時候不必擔心內存洩漏問題
.& 好像不直接支持堆內存的申請(這個來說很危險)不過我們可以通過調用win api 的方法進行申請這樣就可以解決剩下%的問題堆內存申請的方法在MSDN裡面有相關的文檔具體實現代碼見附
.  結構體是一個特殊的對象他與類的定義就差一個關鍵字使用方法也和類一樣可以定義屬性可以定義方法但是在進行指針操作的時候雙方就有很大的差別了結構體可以通過sizeof()取得大小大小與結構體裡有多少實體變量有關但是如果struck裡定義了類的對象或者指針sizeof可能會編譯不過(void* 的空指針例外不過需要在結構體聲明處加上unsafe)
. fixed關鍵字目前了解的不多不過有一個很實用的例子可以讓指針能夠裡的數組進行交互操作
 
                byte[] buffer = new byte[];
                fixed (byte* p = buffer)
                {
                    P[] = ;
                    ……
                }
 
.  其它
.  
 
 
 
 

    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 != ; count) *pd++ = *ps++;
            }
            else if (ps < pd)
            {
                for (ps += count pd += count; count != ; count) *pd = *ps;
            }
        }
        // Frees a memory block
        public static void Free(void* block)
        {
            if (!HeapFree(ph block)) throw new InvalidOperationException();
        }
        // Reallocates 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 block);
            if (result == ) throw new InvalidOperationException();
            return result;
        }
        // Heap API flags
        const int HEAP_ZERO_MEMORY = x;
        // Heap API functions
        [DllImport(kernel)]
        static extern int GetProcessHeap();
        [DllImport(kernel)]
        static extern void* HeapAlloc(int hHeap int flags int size);
        [DllImport(kernel)]
        static extern bool HeapFree(int hHeap int flags void* block);
        [DllImport(kernel)]
        static extern void* HeapReAlloc(int hHeap int flags
           void* block int size);
        [DllImport(kernel)]
        static extern int HeapSize(int hHeap int flags void* block);
    }
From:http://tw.wingwit.com/Article/program/net/201311/13152.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.