极语言官方网站

指针和列举语法

极语言并没有专门的指针定义,但是可以实现甚至超越指针的所有功能

例如

整数 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;这样写就不会进行转换,直接从内存地址处获取数据

比如游戏封包里包含有坐标值是小数的结构数据

就不能直接使用等号进行赋值,使用左取右写符号直接读写数据