久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

C#指針的用法介紹

這篇文章主要講解了“C#指針的用法介紹”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C#指針的用法介紹”吧!

站在用戶的角度思考問題,與客戶深入溝通,找到大悟網(wǎng)站設(shè)計與大悟網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、空間域名、網(wǎng)絡(luò)空間、企業(yè)郵箱。業(yè)務(wù)覆蓋大悟地區(qū)。

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

要C#使用指針首先要對使用指針的代碼用unsafe進(jìn)行進(jìn)行聲明,聲明和public聲明一樣,可以對整個類進(jìn)行聲明,也可以是類里面某個方法或者屬性。在代碼里什么后,還需要修改工程項目的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)行交互操作:

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#指針的用法介紹”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C#指針的用法介紹這一問題有了更深刻的體會,具體使用情況還需要大家實(shí)踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點(diǎn)的文章,歡迎關(guān)注!

文章名稱:C#指針的用法介紹
文章源于:http://sd-ha.com/article48/jgsghp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、App設(shè)計、虛擬主機(jī)、微信小程序、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)