Mail Archives: djgpp/1998/01/04/10:02:20
Im Artikel <01bd182a$edde3de0$4d3e64c2 AT default>, "laine" <laine AT ks DOT iwn DOT fi>
schreibt:
>Hi!
>
>How can I make a pointer to an array?
>
>I'm not sure if it's called an array, but it's like this:
> array[5][1] (for example)
>
>Thanks
>
This one is from taken the FAQ of comp.lang.c :
2.10: My compiler complained when I passed a two-dimensional array to
a routine expecting a pointer to a pointer.
A: The rule by which arrays decay into pointers is not applied
recursively. An array of arrays (i.e. a two-dimensional array
in C) decays into a pointer to an array, not a pointer to a
pointer. Pointers to arrays can be confusing, and must be
treated carefully. (The confusion is heightened by the
existence of incorrect compilers, including some versions of pcc
and pcc-derived lint's, which improperly accept assignments of
multi-dimensional arrays to multi-level pointers.) If you are
passing a two-dimensional array to a function:
int array[NROWS][NCOLUMNS];
f(array);
the function's declaration should match:
f(int a[][NCOLUMNS]) {...}
or
f(int (*ap)[NCOLUMNS]) {...} /* ap is a pointer to an array */
In the first declaration, the compiler performs the usual
implicit parameter rewriting of "array of array" to "pointer to
array;" in the second form the pointer declaration is explicit.
Since the called function does not allocate space for the array,
it does not need to know the overall size, so the number of
"rows," NROWS, can be omitted. The "shape" of the array is
still important, so the "column" dimension NCOLUMNS (and, for 3-
or more dimensional arrays, the intervening ones) must be
included.
If a function is already declared as accepting a pointer to a
pointer, it is probably incorrect to pass a two-dimensional
array directly to it.
References: K&R I Sec. 5.10 p. 110; K&R II Sec. 5.9 p. 113.
Hope that helps... Christian.
- Raw text -