指针和列举语法
极语言并没有专门的指针定义,但是可以实现甚至超越指针的所有功能
例如
整数 s="sdkfskd";这里s为整数变量,它指向的就是后面这段文字的地址 s(0)=\b; 就把文本的第一个字符替换成字符b; 整数变量本身不是一段文字,通过它却能读写文字的内容 同样
整数 m=申请内存(128);
m(13)=128; 就是把128这个数字写入第14字节处
a=m(10); 是从第11字节处读取1字节。
由于传统编程的文本字节数组和内存数据的用法完全不同
文本只能用处理文字的函数来操作文字里面的内容数据
申请内存也只能使用复制传送内存的函数来读写数据
字节数组才可以使用数组的写法来读写数组成员数据
所以需要一种特殊的指针来突破这些限制自由的读写数据
而极语言没有这些限制,所以本身就可以实现指针的功能
同时也把其它特性比如列举功能整合到指针上
结构体类型和子类数据包含有很多成员,可以使用列举语法:
列举 人物{.等级=35;.职业=6; 物攻=.攻击;血量=.生命}
列举是记住结构体或子类的首地址,加上成员的偏移地址进行读写操作
同样在数组操作时,也会已经记住变量的首地址,可以使用仿列举来读写数据。
还使用一个文本变量来演示,示例代码:
文本 内容[64]="0123456789ABCDEF"; 数值=内容(1); 使用数组获取第二字节数值 .(6)=数值 //6是指针之后偏移6字节,读写操作6这个字 .%6=数值 //6是指针之后偏移6字节,读写操作67这两个字 .&6=数值 //6是指针之后偏移6字节,读写操作6789这四个字 .!6=数值 //6是指针之后偏移6字节,读写操作6789这四个字的小数值
使用.语法跟列举的写法类似,但是文本或数据或者内存缓冲区
这些变量并没有成员变量,不能通过成员名来定位,则可以使用数值来定位偏移地址
最早是用#符号作为虚指针的偏移定位,代码写法如下:
数值=#4 //#4是指针之后偏移4字节,就是读取4567这四个字 数值=#(4) //#(4)是指针之后偏移4字节,小括号就是读取4这一个字 数值=#[4] //#[4]是指针之后偏移4字节,中括号就是读取45这两个字 数值=#@4 //#@4是指针之后偏移4字节,就是4这个字的位置(取文本) 数值=##4 //##4是指针之后偏移4字节,就是读取456789AB这8个字(取浮点数)
指针操作相关符号:
符号 | 作用 | 用法示例 |
@ | 取内存地址 | @变量名或程序段名 |
< | 左取符号 | 从右边表达式的内存地址读取数据,根据左边变量类型读1到4字节 |
> | 右写符号 | 向右边表达式的内存地址写入数据,根据左边变量类型写1到4字节 |
[] | 取内存处的数据 | 值=变量[8];获取变量地址后第8字节处的字节值 |
[]% | 取内存处的数据 | 值=变量[8]%;获取变量地址后第8字节处的正数值 |
[]& | 取内存处的数据 | 值=变量[8]&;获取变量地址后第8字节处的整数值 |
` | 取已知内存 | 使用中括号后取1字节值:值=`;指针后移1字节 |
`% | 取已知内存 | 使用中括号后取2字节值:值=`%;指针后移2字节 |
`& | 取已知内存 | 使用中括号后取4字节值:值=`&;指针后移4字节 |
.? | 写结果内存 | .?=30;向返回结果的内存地址写入一字节数值 |
.?2 | 写结果内存 | .?2=300;向返回结果的内存地址写入两字节数值 |
.?4 | 写结果内存 | .?4=888;向返回结果的内存地址写入四字节数值 |
() | 读写指定内存数据 | b=a(3);a(b*6+c/100)=66+d*78;非数组读写一字节 |
()% | 读写指定内存数据 | 数=组%;组(b*6)%=值;非数组读写两字节 |
()& | 读写指定内存数据 | 数=组(2)%;组&=值;非数组读写四字节 |
% | 读写指定内存数据 | 数=组%;组%=值;非数组读写两字节,(0)%偏移为零时可省略(0) |
& | 读写指定内存数据 | 数=组&;组&=值;非数组读写四字节,(0)&偏移为零时可省略(0) |
()$ | 读写指定内存地址 | 数组指针获取地址指针:地址=$460 |
()! | 读写指定内存数据 | 数组指针读取或写入单精度值:数=组(2)!;组(6)!=值; |
()# | 读写指定内存数据 | 数组指针读取或写入双精度值:数=组(2)#;组(6)#=值; |
# | 取已知内存 | 使用小括号或列举后取值(整数或小数):#4 |
#@ | 取已知内存 | 使用小括号或列举后取地址(文本):#@8 |
#() | 取已知内存 | 使用小括号或列举后取值(字节):#(12) |
#[] | 取已知内存 | 使用小括号或列举后取值(正数):#[12] |
## | 取已知内存 | 使用小括号或列举后取值(浮点):##16 |
_[] | 读写已知内存 | 使用中括号后读取或写入字节值:_(2)=60 |
_[]% | 读写已知内存 | 使用中括号后读取或写入2字节值:_(4)%=60 |
_[]& | 读写已知内存 | 使用中括号后读取或写入整数值:_(2)&=60;n=_[4]& |
_[]$ | 读写已知内存地址 | 使用中括号后获取地址指针:地址=_[460]$ |
_[]! | 读写已知内存 | 使用中括号后读取或写入单精度值:_(4)!=60 |
_[]# | 读写已知内存 | 使用中括号后读取或写入双精度值:_(8)#=60 |
.() | 读写已知内存 | 使用小括号或列举后读取或写入字节值:.(2)=60 |
.% | 读写已知内存 | 使用小括号或列举后读取或写入2字节值:.%4=60 |
.& | 读写已知内存 | 使用小括号或列举后读取或写入整数值:.&2=60;n=.&4 |
.$ | 读写已知内存地址 | 使用小括号或列举后获取地址指针:地址=.$460 |
.! | 读写已知内存 | 使用小括号或列举后读取或写入单精度值:.!4=60 |
.# | 读写已知内存 | 使用小括号或列举后读取或写入双精度值:.#6=60 |
.+ | 增加已知内存 | 数据表使用列举时内存增加指定长度:.+10;.+长度; |
.++ | 增加已知内存 | 数据表使用列举时内存增加到下一行 |
< | 读指定内存数值 | a < b;从b地址处取数据到a,a是字节取一字节,整形取两字节,局部变量固定4字节 |
> | 写指定内存值 | a>b+8;向b+8地址处写入a的数值,a是字节写一字节,整形写两字节,局部变量固定4字节 |
虚指针就是记住一个内存地址,使用数值定位指针之后的位置进行读写数据
用特殊符号来定义读写的数据是什么类型,而不需要进行字节组和其它类型的数据转换
比如在括号后面加 % 就可以读写两字节正数,加 & 读写四字节整数,加 # 读写八字节浮点。示例代码:
文本 内容[64]="0123456789ABCDEF"; 数值=内容[0] //从数据缓冲区读取第一字节数值,0这个字 数值=_[2] //从缓冲区的2字节后读取一字节数据,2这个字 数值=_[2]% //从缓冲区的2字节后读取两字节数据,23这两个字 数值=_[2]& //从缓冲区的2字节后读取四字节数据,2345这四个字 _[4]=数值 //内容缓冲区向后4字节,就是向4这个字处写一字节 _[4]%=数值 //内容缓冲区向后4字节,百分号就是向45这两个字处写入两字节 _[4]&=数值 //内容缓冲区向后4字节,连接号就是向4567这里写入四字节数值
//==============更早期还有一种指针用法=============
全局变量是字节 整形 整数 小数等4字节以内的数值类型,可以使用左取右写符号
如 文本 a="$32A4B8C6428B";字节 b;正数 i;小数 s;整数 d;
b < a;就是取第一字节,b就得到0x32=50
b > a+2;就把a的第三位置0xB8,换成了50
i < a+3;i取得数值就是0x8B42=35650;
小数使用等号时会把右边的结果转换成小数进行赋值
s < a+4;这样写就不会进行转换,直接从内存地址处获取数据
比如游戏封包里包含有坐标值是小数的结构数据
就不能直接使用等号进行赋值,使用左取右写符号直接读写数据