Array of Variable Element Arrays

QUESTION: Is there any way to handle nested arrays in IDL (that is, an array of arrays, or lists)? Say I want to populate an array with sub-arrays of variable length, something like this:

  [ [1,2,3,4]
    [1,2] ]

If I knew the maximum number of arrays, and the maximum dimension for all of those arrays, I could make a 2-D array (rectangular) - but, a) I don't know this beforehand and, b) even if I did, it would be a huge waste of space and efficiency. I've perused a lot of web-postings, but have not been able to find an answer, save using a structure of multiple arrays - blech!

ANSWER: Typically, we use a pointer array for this purpose:

   IDL> variable = $
     [ Ptr_New([1,2,3,4], /No_Copy), $
       Ptr_New([1,2,3], /No_Copy), $
       Ptr_New([1,2,3,4,5,6,7,8,9], /No_Copy), $
       Ptr_New([1], /No_Copy), $
       Ptr_New(/Allocate_Heap), $
       Ptr_New([1,2], /No_Copy) ]
   IDL> Help, variable
   VARIABLE        POINTER   = Array[6]
   IDL> Print, *variable[2]
          1       2       3       4       5       6       7       8       9
   IDL> Print, *variable[1]
          1       2       3

Note that the fifth pointer in this array is a valid pointer, even though it doesn't yet contain any data.

   IDL> Print, Ptr_Valid(*variable[4])

I would get an error if I use this array in an expression, because the pointer points to an undefined variable:

   IDL> Print, *variable[4] * 3
      Variable is undefined: .
      Execution halted at: $MAIN$   

But, because it is a valid pointer, I can fill it with data at any time:

   IDL> *variable[4] = Findgen(6)
   IDL> Print, *variable[4]
     0.000000      1.00000      2.00000      3.00000      4.00000      5.00000

Also note that I can store any kind of information I like in the pointer array:

   IDL> *variable[2] = 'This is a string stored in the pointer array'
   IDL> *variable[3] = {field1: 'This is a structure', field2:[2,3]}
   IDL> Help, *variable[2]
                STRING    = 'This is a string stored in the pointer array'
   IDL> Help, *variable[3]
   ** Structure <2b809d0>, 2 tags, length=16, data length=16, refs=1:
      FIELD1          STRING    'This is a structure'
      FIELD2          INT       Array[2]

If pointers are unfamiliar, you can learn more by reading the Pointer Tutorial.

Web Coyote's Guide to IDL Programming