您好,登錄后才能下訂單哦!
這篇文章主要講解了“C#指針的用法介紹”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C#指針的用法介紹”吧!
指針在C\C++里面可是一個好東西,但是到java,.net的時代指針已經被封裝起來,對用戶不可見,這點java做的非常的徹底。.net可能因為還存在一個托管C++,因此指針并沒有完全廢除,C#還是保留了指針的操作。
要C#使用指針首先要對使用指針的代碼用unsafe進行進行聲明,聲明和public聲明一樣,可以對整個類進行聲明,也可以是類里面某個方法或者屬性。在代碼里什么后,還需要修改工程項目的Build屬性,讓編譯器支持指針的操作。
做好事前的工作就可以C#使用指針了。指針的使用方法和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關鍵字:目前了解的不多,不過有一個很實用的例子可以讓C#使用指針能夠和.net里的數組進行交互操作:
byte[]buffer=newbyte[100]; fixed(byte*p=buffer) { P[0]=123; …… }
其它
publicunsafeclassMemory { //Handlefortheprocessheap.Thishandleisusedinallcallstothe //HeapXXXAPIsinthemethodsbelow. staticintph=GetProcessHeap(); //Privateinstanceconstructortopreventinstantiation. privateMemory(){} //Allocatesamemoryblockofthegivensize.Theallocatedmemoryis //automaticallyinitializedtozero. publicstaticvoid*Alloc(intsize) { void*result=HeapAlloc(ph,HEAP_ZERO_MEMORY,size); if(result==null)thrownewOutOfMemoryException(); returnresult; } //Copiescountbytesfromsrctodst.Thesourceanddestination //blocksarepermittedtooverlap. publicstaticvoidCopy(void*src,void*dst,intcount) { byte*ps=(byte*)src; byte*pd=(byte*)dst; if(ps>pd) { for(;count!=0;count--)*pd++=*ps++; } elseif(ps<pd) { for(ps+=count,pd+=count;count!=0;count--)*--pd=*--ps; } } //Freesamemoryblock. publicstaticvoidFree(void*block) { if(!HeapFree(ph,0,block))thrownewInvalidOperationException(); } //Re-allocatesamemoryblock.Ifthereallocationrequestisfora //largersize,theadditionalregionofmemoryisautomatically //initializedtozero. publicstaticvoid*ReAlloc(void*block,intsize) { void*result=HeapReAlloc(ph,HEAP_ZERO_MEMORY,block,size); if(result==null)thrownewOutOfMemoryException(); returnresult; } //Returnsthesizeofamemoryblock. publicstaticintSizeOf(void*block) { intresult=HeapSize(ph,0,block); if(result==-1)thrownewInvalidOperationException(); returnresult; } //HeapAPIflags constintHEAP_ZERO_MEMORY=0x00000008; //HeapAPIfunctions [DllImport("kernel32")] staticexternintGetProcessHeap(); [DllImport("kernel32")] staticexternvoid*HeapAlloc(inthHeap,intflags,intsize); [DllImport("kernel32")] staticexternboolHeapFree(inthHeap,intflags,void*block); [DllImport("kernel32")] staticexternvoid*HeapReAlloc(inthHeap,intflags, void*block,intsize); [DllImport("kernel32")] staticexternintHeapSize(inthHeap,intflags,void*block); }
感謝各位的閱讀,以上就是“C#指針的用法介紹”的內容了,經過本文的學習后,相信大家對C#指針的用法介紹這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。