Paul Schauble <Schauble@MIT-MULTICS.ARPA> (01/08/85)
Pardon my lack of familiarity with modern C. I do hope someone will take time to answer this: From Joseph S.D. Yao <hadron!jsdy at SEISMO> commenting on the declaration int a[5][6]; as a function formal parameter. > Oh, and i think you may have missed the earlier comment that, despite > the syntactic sugar of declaring the argument as if it were an array, > it actually i s a pointer, in compatibility with early versions of C > that wouldn't let you pass anything longer than a word/longword as an > argument. The pointer's size is correctly returned by sizeof(). Current C compilers allow passing a structure as a parameter. That's a real structure, not a pointer to a struct as in the old style. I presume then that one can pass a real array in the same fashion. then if function (a); int a[5][6] says that the parameter is "really" a pointer, for compatability, what does the declaration look like when the parameter is really an array? Or where did I go wrong? Paul .
Doug Gwyn (VLD/VMB) <gwyn@Brl-Vld.ARPA> (01/08/85)
No, arrays cannot be passed as actual arguments to a function but only their addresses. function( a ) int a[5][6]; { ... } has just one pointer datum passed to it, not 30 ints. The difference is significant; due to C's "pass-by-value" design, in the actual case "function" can modify the caller's array while in the incorrect case (entire array as argument) it could only modify its own local copy of the array.
ndiamond@watdaisy.UUCP (Norman Diamond) (01/10/85)
In order to pass an array parameter by value (instead of passing a pointer to it), the array has to be imbedded in a structure and the structure then passed by value. I suppose if one wants to pass a structure by reference, it could be made an array of size 1. (Of course, one could also use &, but obviously that would be cheating -- if the use of & could be suggested for structure references, then it could also be suggested for array references, and the default could be by value consistently.) -- Norman Diamond UUCP: {decvax|utzoo|ihnp4|allegra|clyde}!watmath!watdaisy!ndiamond CSNET: ndiamond%watdaisy@waterloo.csnet ARPA: ndiamond%watdaisy%waterloo.csnet@csnet-relay.arpa "Opinions are those of the keyboard, and do not reflect on me or higher-ups."
mat@hou4b.UUCP (Mark Terribile) (01/10/85)
> Current C compilers allow passing a structure as a parameter. That's a > real structure, not a pointer to a struct as in the old style. > I presume then that one can pass a real array in the same fashion. Nope. Structures and arrays are fundamentally different sorts of aggregates with very different properties. > function (a); > int a[5][6] In this case, what you have is equivalent to int (*a)[ 6 ]; -- a pointer to an array of six ints. One of our local compilers accepts all of these without complaint: f( a ) int a[5][6]; { y( a ); } g( a ) int a[5][]; { y( a ); } h( a ) int a[][6]; { y( a ); } i( a ) int (*a)[6]; { y( a ); } -- from Mole End Mark Terribile (scrape .. dig ) hou4b!mat ,.. .,, ,,, ..,***_*.