指针基本概念
每台计算机都包含用于存储程序、文件、变量等的“存储器”。这种存储器(我们也将其称为“内存”,即使它实际上可能是任何现代操作系统上的磁盘空间)通常是编号,以便其中的每个字节都有一个唯一的地址。
当你运行一个程序时,它需要使用内存中的空间来放置过程、变量等内容。运行该程序(或任何其他程序)的每个作业都需要在内存中拥有自己独特的空间,不会与其他所有作业冲突运行所有其他程序。因此,应由操作系统在请求时分配有效的内存区域。
请求为程序提供内存的过程称为“分配内存”。一个典型的场景是这样的:
一个程序被调用。
当程序需要一个地方来存储变量时,它会询问操作系统,说“我需要 10 字节的内存”
操作系统回复类似“您可以使用从位置 71533 开始的 10 字节内存!”
程序继续运行,当它完成时,对操作系统说“我已经完成了位置 71533 的内存”
那么什么是指针呢?
指针只不过是一个保存内存地址的变量!
由于任何给定变量在内存中的起始地址可能因程序和作业而异,因此该地址必须存储在某种“内存地址变量”中。这种类型的变量称为“指针”。
怎么用指针
通常,RPG 编译器会自动创建程序代码,为您定义的变量分配内存,从而节省您必须自己完成的所有工作。
然而,有时,能够自己直接处理内存地址是很方便的。这允许您:
-
将两个或多个变量放入同一内存区域。
-
将变量从内存中的一个位置移动到另一个位置
-
将整个数据结构在内存中从一个地方移动到另一个地方(对于处理列表非常有用)
-
允许您创建可以根据需要增加和减少内存使用量的数据列表
-
让你绕过RPG中单个字符串可以存储32k的限制
一个例子如下:
D Var1 S 12A
D Ptr S *
D Var2 S 12A based(Ptr)
D
D
D
c eval Ptr = %addr(Var1)
c eval Var1 = 'Hello World!'
c dsply Var2
c
** This displays "World Hello!"
c eval Var2 = 'World Hello!'
c dsply Var1
C
c eval *inlr = *on
c return
大家可以互相猜下结果
1) 定义变量Var 1 , 那就是说程序运行时,编译器会自动分配内存,比如在位置75555分配内存
2) 然后讲Ptr 这个指针指向了变量 Var 1, 将Var 1的内存位置75555给到了Ptr
3)定义变量Var 2是基于Ptr 内存地址,那么Var2 就不会被程序分配内存而是占用Ptr 指针指向的那个内存的变量
那么答案以上结果就出去来了:
当Var 1 给赋值到以下值的时候,对于Var 2也会得到Hello Word 的值。同样,当Var 2 的值变化了,对于75555后面的12位Char 也会变化,Var 也会同时变成World Hello!
地址:Ptr=75555
Var 1--> [hello word]
Var 2-->
还有一种用法for 指针,就是大String之间的互相传参,比如说你有一个300万的字符的参数要传。在做API的时候,或者实时去接数据的时候,面对现在的Json格式你要怎么做;
Ptr 是入口参数指针
D Var1 S 12A
D I S 5S 0
D wkMove1 S 30000A DIM(100)
D Ptr S * 入口参数
D Ptr1 S *
D wkMove S 30000A DIM(100) BASED(Ptr1)
c eval Ptr1 =%addr(wkMove1)
c clear wkMove
C eval I = 1
c dow I < 100
c eval wkMove(I) = 'form file loop'
c enddo
C eval Ptr = Ptr1
c eval *inlr = *on
c return
Ptr 是对应的入口参数指针,当用Ptr1已经有值的时候,后续将Ptr的指针地址指向对应的Ptr1指针对应的变量
总结:
指针以使用复杂和危险而著称。许多人拒绝在 RPG IV 中使用指针,而不了解它们的用途以及为什么需要它们。
我希望本教程有助于消除这些恐惧,并展示指针如何成为一种有用的工具。你的下一步是编写程序和实验!通过实验和经验,您将学到的东西比任何教程都能教给您的要多得多。
祝你好运!