System.Runtime.InteropServices命名空间的
Marshal函数可以使用
例1:以下程序我们申请几个指向不同类型的指针:
'使用StructLayout(LayoutKind.Sequential)属性告诉net编译器:结构的元素在内存中按其出现的顺序排列
StructLayout(LayoutKind.Sequential) _
Public Structure DEFUDT_Test
Public bytb As Byte
End Structure
Public Function fnGetIntptr1() As IntPtr
'以下语句告诉net垃圾回收进程不对tabytTest进行处理,也就是说tabytTest占用的内存区域固定不变.
Dim thObject As GCHandle = GCHandle.Alloc(tabytTest, GCHandleType.Pinned)
Dim tpObject As IntPtr = thObject.AddrOfPinnedObject() '取得指向字节数组的指针
'由于使用gchandle取指针的方法只能对引用的对象有效,
Dim tudtTest1 As DEFUDT_Test
'由于结构是一种值类型变量,为保证指针申请方便,我们申请
'取得一个和结构tudtTest1大小一致的字节数组指针,只要空间占用长度和结构一样就可以了
'由于net在结构封装中会插入额外的数据位,所以一定要用sizeof方法得到结构在非托管使用时的实际大小
Dim tudtTest(Marshal.SizeOf(tudtTest1)) As Byte
'在使用完毕后一定要释放指针指向的内存块,让垃圾回收器可对这个内存块回收处理
If thObject.IsAllocated Then
thObject.Free()
End If
If thObject1.IsAllocated Then
thObject1.Free()
End Function
上例中指针流程处理可以归纳为:
①.、 定义一个具有合适内存长度的引用变量(关于引用变量和值变量的差异可以参观VB.NET的书籍)
'到的net中指针没有指向类型的说明.
'这儿可以将字节数组的内容复制到真正的结构中
指针是非强类型化的,当使用一个指针的时候,指向的不是一个特定的类型,而仅仅是一块内存区.对这个指针进行位移操作,然后向此位置写入,就可能破坏内存,所以呢称可以直接操作内存的代码为不安全的(unsafe). 平时我们使用C#,是在托管平台上...
C返回局部变量的值也没问题啊
只是如果这个局部变量是指向栈上的内存的指针,由于函数结束后活动栈被清空,会导致指针失效.
VB.NET不支持指针语法,它不可能返回指向栈上的指针,所以用不着担心这个问题.
你的理解
第一点理解是正确的,不过和这个问题关系不大.因为引用类型本来就不是分配在栈上的,它当然就不受函数的影响.
编译器确实定义了一个和函数同名的变量,那个变量就是一个普通的局部变量,作用域就在函数的局部域里.这个变量没什么特别的,就是编译器会在函数结束时把这个变量的值作为函数的返回值返回而已.
Imports System.Runtime.InteropServices
ByVal AesKey() As Byte
Dim AesKeyObj As GCHandle = GCHandle.Alloc(AesKey, GCHandleType.Pinned)
Dim AesKeyPtr As IntPtr = AesKeyObj.AddrOfPinnedObject
'AesKeyPtr 就是AesKey的指针
If AesKeyObj.IsAllocated Then AesKeyObj.Free()
以上就是土嘎嘎小编为大家整理的vb.net有指针吗相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!