讲了一堆,看的头晕,勉强看懂了,能不能好好表达自己的问题啊.废话一堆,其实有个标题就好了.vb.net不再使用VarPtr来返回变量的地址了,其实是net不提倡使用指针和地址.
net有了一个新的叫做托管的概念,建议了解一下,net里面的变量地址都是不确定的,生存周期也不确定,是由托管机制来管理内存,程序员不必再纠结于内存的管理而浪费精力.
解决方法:可以使用byref声明为整型变量直接将变量地址传过去就好,不用声明为什么指针的.
或者可以试试下面这个:
GCHandle 类的 AddressOfPinnedHandle 方法可以提供类似的功能.
例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中指针没有指向类型的说明.
'这儿可以将字节数组的内容复制到真正的结构中
指针是c语言的概念,VB、VB.NET没有指针,除了指针以外也很少有人能玩到你的编程深度,关键看不懂呢.
Private Sub my_do ()
........
End Sub
相应的AddHandler c.Click, AddressOf my_do
实际上是个委托
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()
System.Runtime.InteropServices命名空间的
Marshal函数可以使用
顾名思义,new就是给变量赋值一个新的对象
dim不加new就是说变量是XX类型的,但它不是一个真正的XX对象.如果给这个变量赋值的话,实际上就是把某一对象的指针存到变量里,它依旧不是一个对象
一个普通的类,里面有一些数据,你要弄一个对象的话,需要初始化所有类中的数据并调用构造函数.这时候我们就用new了.如果你不用new,然后直接使用的话,会引发null异常
当然上面的讨论不包括Integer、String、Long这样的数值类型,这些不能用new
以上就是土嘎嘎小编为大家整理的vb.net声明指针相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!