成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C#使用指針詳細(xì)介紹

開發(fā) 后端
這里介紹要C#使用指針首先要對(duì)使用指針的代碼用unsafe進(jìn)行進(jìn)行聲明,聲明和public聲明一樣,可以對(duì)整個(gè)類進(jìn)行聲明,也可以是類里面某個(gè)方法或者屬性。

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

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

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

下面是對(duì)指針的一些使用上的理解:

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

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

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

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

5.fixed關(guān)鍵字:目前了解的不多,不過有一個(gè)很實(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<pd)  
  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. 簡(jiǎn)單介紹C# 匿名方法
  5. C# FileSystemWatcher對(duì)象
責(zé)任編輯:佚名 來源: 騰訊科技
相關(guān)推薦

2011-07-20 16:43:34

C++

2009-08-10 16:30:56

C# BitmapDa

2009-08-03 17:12:40

C#指針操作

2009-08-12 15:34:40

C# DBNull

2009-08-18 17:37:57

C#固定指針

2011-07-15 01:20:58

C指針函數(shù)函數(shù)指針

2009-09-27 11:14:09

C#數(shù)組

2009-08-07 16:10:20

C#調(diào)用API

2009-08-26 17:31:59

C# const常量

2009-08-03 18:49:17

C#和Java

2009-08-20 15:26:42

C#循環(huán)語句

2009-08-24 18:21:23

C# ListView

2009-08-21 09:23:11

C# GDI+

2009-08-18 17:29:02

C#使用指針

2009-08-14 17:04:50

C#類型系統(tǒng)

2009-08-13 13:38:30

C#命名規(guī)范

2009-08-27 14:32:15

C#編寫ActiveX

2009-08-06 14:59:36

C#編譯器

2009-08-25 17:28:23

C#創(chuàng)建DataSet

2009-08-13 15:48:57

C#指針
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 免费爱爱视频 | 亚洲有码转帖 | 欧美视频精品 | www.嫩草| 伊人导航 | 国产午夜精品一区二区 | 成人精品一区 | 亚洲精品久久久一区二区三区 | 羞羞视频网页 | 久久免费大片 | 精品久久久久久久久久久下田 | 免费视频一区 | 日韩在线观看网站 | 日韩高清国产一区在线 | 成人国产在线观看 | 欧美一级免费看 | 日韩精品网站 | 这里精品 | 午夜一级黄色片 | 91文字幕巨乱亚洲香蕉 | 91精品国产91久久综合桃花 | 久久久久亚洲精品 | 国产午夜精品一区二区 | 国产精品一区三区 | 91精品一区二区三区久久久久 | 亚洲 欧美 精品 | 欧美日韩国产在线观看 | 亚洲综合二区 | 国产一区黄色 | 精品视频在线观看 | 欧美精品网站 | 久久电影一区 | 欧美精品1区 | 99精品视频在线观看 | 久久久久久电影 | 91av免费版 | av在线一区二区三区 | 成人免费高清 | 天天操夜夜操 | 成人午夜激情 | 视频一区二区三区四区五区 |