日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#使用指針詳細(xì)介紹

指針在C\C++里面可是一個好東西,但是到j(luò)ava,.net的時代指針已經(jīng)被封裝起來,對用戶不可見,這點(diǎn)java做的非常的徹底。.net可能因?yàn)檫€存在一個托管C++,因此指針并沒有完全廢除,C#還是保留了指針的操作。

在科爾沁等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作專業(yè)公司,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),全網(wǎng)整合營銷推廣,外貿(mào)網(wǎng)站建設(shè),科爾沁網(wǎng)站建設(shè)費(fèi)用合理。

要C#使用指針首先要對使用指針的代碼用unsafe進(jìn)行進(jìn)行聲明,聲明和public聲明一樣,可以對整個類進(jìn)行聲明,也可以是類里面某個方法或者屬性。在代碼里什么后,還需要修改工程項(xiàng)目的Build屬性,讓編譯器支持指針的操作。

做好事前的工作就可以C#使用指針了。指針的使用方法和C++下使用沒有太多差別。只要編譯器不報錯就沒有太大問題。

下面是對指針的一些使用上的理解:

1.指針類型可以是實(shí)體變量(int,double)也可以是enum,同時也支持結(jié)構(gòu)體變量struct。但不能是類。不過空指針可以指向類,只不過空指針不能進(jìn)行任何操作,也只能把空指針作為傳遞對象來使用。

2.C#提供一個的關(guān)鍵字stackalloc用于申請堆棧內(nèi)存。注意,這個申請內(nèi)存分配的是棧內(nèi)存,當(dāng)函數(shù)執(zhí)行完畢后,內(nèi)存會被自動回收。不過我想用這個棧內(nèi)存基本可以解決40%的問題,而且使用的時候不必?fù)?dān)心內(nèi)存泄漏問題。

3 .net好像不直接支持堆內(nèi)存的申請(這個對.net來說很危險),不過我們可以通過調(diào)用win32 api 的方法進(jìn)行申請。這樣就可以解決剩下40%的問題。堆內(nèi)存申請的方法在MSDN里面有相關(guān)的文檔,具體實(shí)現(xiàn)代碼見附1。

4.結(jié)構(gòu)體是一個特殊的對象。他與類的定義就差一個關(guān)鍵字,使用方法也和類一樣,可以定義屬性,可以定義方法。但是在進(jìn)行指針操作的時候雙方就有很大的差別了。結(jié)構(gòu)體可以通過sizeof()取得大小,大小與結(jié)構(gòu)體里有多少實(shí)體變量有關(guān),但是如果struck里定義了類的對象,或者指針,sizeof可能會編譯不過(void* 的空指針例外,不過需要在結(jié)構(gòu)體聲明處加上unsafe)。

5.fixed關(guān)鍵字:目前了解的不多,不過有一個很實(shí)用的例子可以讓C#使用指針能夠和.net里的數(shù)組進(jìn)行交互操作:

 
 
 
  1. byte[]buffer=newbyte[100];  
  2. fixed(byte*p=buffer)  
  3. {  
  4. P[0]=123;  
  5. ……  

其它

 
 
 
  1. publicunsafeclassMemory  
  2. {  
  3. //Handlefortheprocessheap.Thishandleisusedinallcallstothe  
  4. //HeapXXXAPIsinthemethodsbelow.  
  5. staticintph=GetProcessHeap();  
  6. //Privateinstanceconstructortopreventinstantiation.  
  7. privateMemory(){}  
  8. //Allocatesamemoryblockofthegivensize.Theallocatedmemoryis  
  9. //automaticallyinitializedtozero.  
  10. publicstaticvoid*Alloc(intsize)  
  11. {  
  12. void*result=HeapAlloc(ph,HEAP_ZERO_MEMORY,size);  
  13. if(result==null)thrownewOutOfMemoryException();  
  14. returnresult;  
  15. }  
  16. //Copiescountbytesfromsrctodst.Thesourceanddestination  
  17. //blocksarepermittedtooverlap.  
  18. publicstaticvoidCopy(void*src,void*dst,intcount)  
  19. {  
  20. byte*ps=(byte*)src;  
  21. byte*pd=(byte*)dst;  
  22. if(ps>pd)  
  23. {  
  24. for(;count!=0;count--)*pd++=*ps++;  
  25. }  
  26. elseif(ps)  
  27. {  
  28. for(ps+=count,pd+=count;count!=0;count--)*--pd=*--ps;  
  29. }  
  30. }  
  31. //Freesamemoryblock.  
  32. publicstaticvoidFree(void*block)  
  33. {  
  34. if(!HeapFree(ph,0,block))thrownewInvalidOperationException();  
  35. }  
  36. //Re-allocatesamemoryblock.Ifthereallocationrequestisfora  
  37. //largersize,theadditionalregionofmemoryisautomatically  
  38. //initializedtozero.  
  39. publicstaticvoid*ReAlloc(void*block,intsize)  
  40. {  
  41. void*result=HeapReAlloc(ph,HEAP_ZERO_MEMORY,block,size);  
  42. if(result==null)thrownewOutOfMemoryException();  
  43. returnresult;  
  44. }  
  45. //Returnsthesizeofamemoryblock.  
  46. publicstaticintSizeOf(void*block)  
  47. {  
  48. intresult=HeapSize(ph,0,block);  
  49. if(result==-1)thrownewInvalidOperationException();  
  50. returnresult;  
  51. }  
  52. //HeapAPIflags  
  53. constintHEAP_ZERO_MEMORY=0x00000008;  
  54. //HeapAPIfunctions  
  55. [DllImport("kernel32")]  
  56. staticexternintGetProcessHeap();  
  57. [DllImport("kernel32")]  
  58. staticexternvoid*HeapAlloc(inthHeap,intflags,intsize);  
  59. [DllImport("kernel32")]  
  60. staticexternboolHeapFree(inthHeap,intflags,void*block);  
  61. [DllImport("kernel32")]  
  62. staticexternvoid*HeapReAlloc(inthHeap,intflags,  
  63. void*block,intsize);  
  64. [DllImport("kernel32")]  
  65. staticexternintHeapSize(inthHeap,intflags,void*block);  

【編輯推薦】

  1. 如何用C#和ADO.NET訪問
  2. 淺析C# Switch語句
  3. C#驗(yàn)證輸入方法詳解
  4. 簡單介紹C# 匿名方法
  5. C# FileSystemWatcher對象

本文名稱:C#使用指針詳細(xì)介紹
分享路徑:http://www.5511xx.com/article/ccoicph.html