0

I was wondering if it is possible to reach the lowest level (the non-pointer level) of an n-dimensional array in C by conditionally dereferencing different layers of pointers until you reach a layer that is not pointers, as in the following example:

if(i_is_a_pointer){
  for(i = 0; i < some_given_length; i++){
    if((*i)_is_a_pointer){
      for(j = 0; j < some_given_length; j++){
        if((**i)_is_a_pointer)...etc.
      }
    }
  }
}

which would delve through the array either until it hit a non-pointer or exhausted the final block of code written. How would one go about, in C, determining if the thing is a pointer (I would guess that sizeof would work, if the target non-pointer were of a different size than the memory address), and would the statement **i be a compile-time or run-time error if *i were not itself a pointer?

Additionally, which languages and techniques do you use/would you recommend for traversing the non-array elements of an n-dimensional array, where n is determined at run-time?

algorowara
  • 1,700
  • 1
  • 15
  • 15
  • C is a good language at traversing n demensional arrays. It will take a bit of pracice using dynamically allocated sizes, but it can be a very powerful tool. – SetSlapShot Jun 15 '12 at 19:49

1 Answers1

4

Multi-dimensional arrays in C aren't, as you seem to infer, nests of pointers until you reach the final level. They are just blocks of data. Outer dimensions automatically convert to pointers in certain contexts: The array converts to a pointer to its first element. For example,

int a[3][4][5];

can also be written

typedef int INNER[5];    // array of 5 ints
typedef INNER MIDDLE[4]; // array of 5 INNERs (not pointers)
typedef MIDDLE OUTER[3]; // array of 3 MIDDLEs (not pointers)
OUTER a;

Then these are also equivalent pointer conversions of arrays.

MIDDLE *pm = a;
INNER *pi = a[0];
int *p = a[0][0];

and

int (*pm)[4][5] = a;
int (*pi)[5] = a[0];
int *p = a[0][0];

And finally since C is statically typed, there is no way or need to analyze types at run time as you are trying to do with your if statements. In a compiled C program, there is essentually no type information remaining.

Gene
  • 46,253
  • 4
  • 58
  • 96
  • I was under the impression that an array of arrays in C would be a pointer to the zeroth element of the array, which would itself be an array taking the form of a pointer to its own zeroth element, which would be some non-pointer thing. Is this impression incorrect, or are you and I thinking about different meanings for the term "nest of pointers?" – algorowara Jun 15 '12 at 19:59
  • 1
    In c, the allocation would be of one contiguous memory block for a multi-dimensional array. So if you had `int Coordinates[ 10 ][ 10 ][ 10 ]`, it is ONE pointer... to Coordinates[0][0][0], and passed around, because it was allocated as `int [ 10 * 10 * 10 ]` – StarPilot Jun 15 '12 at 20:08
  • 1
    @CosmicComputer, this impression is incorrect. What you describe is an *emulation* of an N-dimensional array. A "real" 2-dimensional array in c is an "array of arrays". – Jens Gustedt Jun 15 '12 at 20:09