C 和記憶體指標

2021-06-07 08:05:48 字數 2052 閱讀 3029

c#和記憶體指標

關 鍵 詞: serverword.net 

雖然到了.net  的runtime  時代,c  仍然是不可磨滅的主要支柱,包括在msdn  裡見到的api  大部都是有指標型別存在,那麼在以c  冠首的c#  裡應當如何去使用指標呢?  

其實,c#  裡可以直接使用結構型的變數引用進api,但是畢竟它不是指標在對一些涉及以結構陣列存放的記憶體區操作可能就力有不及了,我舉乙個例子要使用到結構陣列的乙個api(對這個api  不必加以了解,我們不是主說api): 

net_api_status  netshareenum(

lpwstr  servername,

dword  level,

lpbyte*  bufptr,

dword  prefmaxlen,

lpdword  entriesread,

lpdword  totalentries,

lpdword  resume_handle

);及它要用到的結構  (設  level  為1):

typedef  struct  _share_info_1    share_info_1,  *pshare_info_1,  *lpshare_info_1;

在第三個引數  lpbyte*  bufptr  它就是乙個指標,而非c  型傳統語言的陣列的做法,就可以直接宣告成  ref  share_info_1  bufptr,但我不推薦這麼做,原因之一在c#  似乎還不支援結構陣列塊,而且它並沒有存在陣列型結構引數的過載。暫且不說如何去實現它,我希望以  c  的操作方式-指標去實現,所以我轉成  c#  宣告如下:

[structlayout(layoutkind.sequential)]

protected  struct  share_info_1  

[dllimport("netapi32.dll",  entrypoint="netshareenum")]

protected  static  extern  int  netshareenum(

[marshalas(unmanagedtype.lpwstr)]  string  servername,

[marshalas(unmanagedtype.u4)]  uint  level,

ref  intptr  bufptr,

[marshalas(unmanagedtype.u4)]  uint  prefmaxlen,

[marshalas(unmanagedtype.u4)]  ref  uint  entriesread,

[marshalas(unmanagedtype.u4)]  ref  uint  totalentries,

[marshalas(unmanagedtype.u4)]  ref  uint  resume_handle

);在上面的函式執行完成後,會在指標  bufptr  所指的位置存在乙個資料塊,此記憶體塊的資料格式是以  share_info_1  結構排列的(假設level為1),並且在  entriesread  中指示該塊的結構個數,那麼我們要如何將它轉成真正可用的型別到  share_info_1  shareinfo;  變數中去呢,其實  c#  提供了一種  marshal.ptrtostructure  的方法,它就是專門將指標所指的非託管記憶體塊搬到託管記憶體中的指定的結構中去,可它不支援結構陣列(目前.net  1.1  還沒有該過載實現過),所以只好也最好乙個乙個的搬(而且乙個乙個搬更形象些),例子如下:

int32  ptr  =  bufptr.toint32();

for  (int  i=0;  i上面的例子很明顯了,bufptr  就是指標,該例子就是將記憶體中的指標所指的記憶體塊(非託管記憶體)以乙個指定結構的大小和排列格式移動.net  記憶體(託管記憶體)中的乙個變數去,然後將指標向後移乙個位置(ptr  +=  marshal.sizeof(shareinfo)),此位置由指標當前位置加上  marshal.sizeof(shareinfo)  也就是已經移完的大小獲得,它的意思其實就是將指標移到已經搬完的資料的後面去準備搬一下結構塊

這個例子只是說明指標的用法,並不是主要說api  對該api  及它的引數不必細加研究

C 和記憶體指標

雖然到了.net 的runtime 時代,c 仍然是不可磨滅的主要支柱,包括在msdn 裡見到的api 大部都是有指標型別存在,那麼在以c 冠首的c 裡應當如何去使用指標呢?其實,c 裡可以直接使用結構型的變數引用進api,但是畢竟它不是指標在對一些涉及以結構陣列存放的記憶體區操作可能就力有不及了,...

C 指標記憶體

這是乙個關於c 指標的問題,思考了一下 void getmemory char p,int num p char malloc sizeof char num void test void char str null getmemory str,100 str 仍為null strcpy str,h...

c 指標和記憶體結構總結

指標的操作 加法 減法 sizeof 解引用 指向操作符 int arr 3 int p1 arr 和int p1 arr 0 一致 int p2 p1 1 和int p2 arr 1 一致 int p3 p2 1 和int p1 arr 一致解引用操作 int a 10 int p a p記憶體塊...