How do you declare a pointer to a two dimensional array?

Chris Torek chris at mimsy.umd.edu
Sun Nov 4 19:51:23 AEST 1990


>In article <9197 at aggie.ucdavis.edu> rogers at iris.ucdavis.edu
>(Brewski Rogers) asks:
>>	float	spam[4][4];
>>How do I declare a pointer to it? Is this possible?

In article <16189 at csli.Stanford.EDU> poser at csli.Stanford.EDU
(Bill Poser) answers:
>	float (*spamp) [4][4];
>declares spamp to be a pointer to a 4x4 array of floats.

Correct, but chances are that this is not what is desired anyway.
Most likely Mr. Rogers (sorry, I just *had* to write it that way :-) )
wants either `float (*p)[4];' or `float *p;'.

Consider, e.g., the array

	int x[10];

This declares `x' as an object of type `array 10 of int'.  Objects
of type `array N of T', when placed in value contexts (most C contexts
are value contexts), `decay' into values of type `pointer to T' which
point to the first element of that array, i.e., the element whose
index is 0.  So to make use of `x' one would not write

	int (*ap)[10] = &x;	/* NB: legal only in ANSI C, not K&R-1 */

but rather

	int *ip = x;		/* or `= &x[0]' */

After all, the only thing you can do with `ap' that you cannot do with
`ip' is index (or point) off into the n'th array-10-of-int objects, and
there is no other such object.  There is only `ap[0]'.

The same holds for a `float spam[4][4];': this is an object of type
array N=4 of T=(array 4 of float), so you want a pointer to T, or a
pointer to `array 4 of float':

	float (*p)[4] = spam;	/* or `= &spam[0]' */

and now you can index p to get objects 0, 1, 2, and 3:

	float *f = p[1];	/* or &p[1][0] */

	p[3][2] += 3.0;		/* bump element 2 of array number 3 */
-- 
In-Real-Life: Chris Torek, Univ of MD Comp Sci Dept (+1 301 405 2750)
Domain:	chris at cs.umd.edu	Path:	uunet!mimsy!chris



More information about the Comp.lang.c mailing list