📄 pointeri.pb
字号:
;//////////////////////////////////
; Amlinger
; by 2008 02 11
;描述:指针
;目标:指针的声明级使用
;//////////////////////////////////
;休息了几天..
;把一直很想看的 <对不起,我爱你> 看完了.
;(-^-)! 总比别人慢几拍.
;下面说一下我对PureBasic中的变量中特殊符号的理解.
;我想应该把这里的文字放到变量那一节中..
;
;不对之处还请大家给以指正
;#变量名 常量定义
;$数字 16进制数字
;例如:
; $FF 255
; $20 32
;%数字 2进制数字
;例如:
; %11111111 255
; %00100000 32
;变量名$ char *
;例如:
; Str$="123321"
;
;@变量名 取地址
;例如:
; 取Str$的内存地址指针
; Address.d=@Str$
;*变量名 char **???
;例如:
; 取Str$的内存地址指针
; *Address=@Str$
;?变量名 取程序代码地址,用于编译.....
;例如:
;功能:求Lable2与Lable1之间代码的长度
Lable1:
! test Eax,Eax
Lable2:
Debug (?Lable2-?Lable1)
;
;关于 $ * 的变量经常会让我产生混乱的感觉.不知道大家的感觉如何
;所以我把 以 $结尾的变量理解为字符型指针变量 是系统默认的
;把以*开头的变量理解为存放地址的变量 其中也是.d而以只是换了个名字
;因为试了N次.
; Address.d=@Str$ 和 *Address=@Str$
; 结果是相同的,只是输入输出的时候
;Address 与 *Address 是不同的变量名.
;
;还有PureBasic访问的方法也不一样.
;具体有什么不一样..这点我讲不清楚
;大概是保存相同的内存地址,PureBasic处理方法不同
;例如:
Structure HAHA
a.w
b.w
EndStructure
Ar.HAHA
;可以访问结构中的字段
*Address.HAHA=@Ar.HAHA
*Address\a
*Address\b
;;不幸,下面的方法是错误的
;Address.HAHA=@Ar.HAHA
;Address\a
;Address\b
;@变量名
;作用:取变量地址
Variable1.w = 5
Variable2 = @Variable1
;从指定地址读取内存中的内容
Variable3=PeekW(Variable2)
;变量值
Debug "Variable1="+Str( Variable1)
;变量地址
Debug "内存地址 @Variable1="+Str(@Variable1)
;变量地址
Debug "内存地址 Variable2=@Variable1="+Str(Variable2)
;通过变量地址读取变量值
Debug "PeekW("+Str(Variable2)+")="+Str(Variable3)
;保存变量地址的内存地址
Debug "内存地址 @Variable2="+Str(@Variable2)
Debug "内存地址 "+Str(@Variable2)+"的值:"+Str(PeekL(@Variable2))
Debug "内存地址:"+Str(@Variable2)+"->["+Str(PeekL(@Variable2))+"]->"+ Str(PeekW(PeekL(@Variable2)))
;定义一个256字符的缓冲区
Windows.s = Space(256)
Debug "缓冲区在内存中的地址:"+Str(@Windows)
;调用API获取系统目录
;GetWindowsDirectory_(缓冲区内存地址,缓冲区大小)
GetWindowsDirectory_(@Windows.s, 256)
*p=@Windows
Debug *p+1
;显示缓冲区内容
Debug Windows.s
;通过指针显示
Debug "地址["+Str(@Windows)+"]存放内容:"+PeekS(@Windows.s,256)
;下面用自定义的过程把指定地址的内容反转一下
Procedure Reverse(Address)
;功能:对指定地址字符串进行反转操作
;参数:目标地址:
;例子:Reverse(@变量)
;返回:无返回
;结果:存放在原地址中
;0. 123456789
;1. 923456781
; * *
;2. 983456721
; .* *.
;L=SizeOf(Address)-1
L=Len(PeekS(Address))-1
For S=0 To L/2
;从左边读取
n=PeekB(Address+S)
;从右边读取
n1=PeekB(Address+(L-S))
;将左边写入右边
PokeB(Address+(L-S), n)
;将右边写入左边
PokeB(Address+S, n1)
Next S
EndProcedure
;返转字符串
Reverse(@Windows.s)
Debug Windows.s
;下面看看关于"?"在实例中的作用吧
;读取图像资源
;将包含的文字写入Data.dat中
;注意 代码总计算 PointerII.pb 的大小
;及 PointerII.pb 在 本程序中内存的起始位置
If OpenFile(0, "Data.txt")
;
;WriteData(文件号,要写入内容内存起始,写入大小)
Msg$="用OpenFile写入的文件"+Chr(13)+Chr(10)+"OpenFile将在第10节说明,以下是包含文件的内容"+Chr(13)+Chr(10)
WriteData(0,@Msg$, Len(Msg$))
WriteData(0,?DateiLabel1, ?DateiLabel2 - ?DateiLabel1)
;写入成功后,关闭文件
CloseFile(0)
EndIf
;结束程序
End
DateiLabel1:
IncludeBinary "PointerII.pb"
DateiLabel2:
; IDE Options = PureBasic 4.10 (Windows - x86)
; CursorPosition = 164
; FirstLine = 141
; Folding = -
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -