Yes it's simple there are two ways of doing it, mainly it will depend on whether you are using purely ladder or FBD/Ladder.
In Ladder (usually opens up the GXWorks type IDE) then any variable can be indirectly addressed for example:
Lets say you want to point at M100 then you can do one of two things.
Move 0 to Z0 (Move 0 to one of the index registers "Z" 0-7 I think) this sets the indirect pointer.
Then when using M100 you type in M100Z0 this then knows to point at an offset of zero thus M100, Alternately you could set Z0 to 100 then indirectly point to M100 by M0Z0 it's just the offset i.e. M0 plus the offset 100 in Z0 = M100.
But if you use GXW in a Structured project with FBD/LAD then you can do the same but not by Sybolic representation. for example you cannot have a tag "My_Tag" as a global label then use that indirectly like My_Tag[Z0]
What you have to do is make an array of bits for example My_Tag[array 0..100] M0 this then creates an array of 101 M bits starting at M0 to M100
Then you do the following
AND My_Tag[Z0] so it can indirectly address as it's in an array.
see attached pics. if you increment the Z register then this will obviously point to another bit so to re-cap using the index registers you can point to any bit/word etc. by using the above if you need more than one pointer (index) then just use a second index register i.e. Z1, you can also use a D type register as an index register in FBD i.e. in the global or local variables you configure a pointer like My_Pointer = Integer or if a global then perhaps My_Pointer = Integer, D0
My_Array[0..100] of integer
Then the code becomes
TRUE, MOV 100, My_Pointer
AND My_Array[My_Pointer] OUT Y0
As Mitsubishi actually uses reletive addresses when it compiles you must ensure that you do not exceed the boundaries of the memory areas, also makes sense to ensure any array you set is at least as big as the amount you tend to indirectly address for example, you create an array of words say D0 to D100 If your pointer is set to 120 then it will point to D120 or what ever actual D it is so you could overwrite other data. It is generally better to have an array slightly larger than the pointer is likely to reach.