C 和記憶體指標

2021-05-08 11:15:10 字數 2223 閱讀 6198

雖然到了.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//開始將ptr 所指的記憶體塊中搬乙個share_info_1 結構大小並按share_info_1 格式排列的資料到 share_info_1 型變數 shareinfo 中去

share_info_1 shareinfo = (share_info_1)marshal.ptrtostructure(new intptr(ptr), typeof(share_info_1));

ptr += marshal.sizeof(shareinfo); // 這是將指標向後移乙個結構位,因為已經移完乙個結構了

//todo: 操作當前的 shareinfo

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

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

C 和記憶體指標

c 和記憶體指標 關 鍵 詞 serverword.net 雖然到了.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記憶體塊...