esg@mtx5a.UUCP (ed gokhman) (03/07/86)
> z = &x is illegal although the types would match No types do not match here: (int (*)[5]) != (int **) > z = &y[2] is illegal, for no good reason (my opinion) There is a good reason: (int (*)[5]) != (int **) There are also quite a few strange sizeofs like: > sizeof &*(*z.r) == 4 if pointers are 4 bytes what meant, I think, was sizeof &*(*z).r At any rate, a valid point was made. I have another example. Although, the logic of language interpretation is understandable, the result is not elegant: typedef int foo[5]; foo a; main() { funct( a ); } int funct ( b ) foo b; { foo c; printf("%d\n", sizeof b); /* result is 4 if ptr is 4 */ printf("%d\n", sizeof c); /* result is 20 */ } I think, a compiler should appreciate the fact that b was not declared as int * but as int [5] and give a correct size of declared object. Otherwise, it simply should not allow a declaration of a formal parameter as an array. Similar situation may be observed in the new C compilers, where formal parameter may be declared as a function but will be interpreted as a pointer to a function. Another example, where C could be more elegant is the following: file1.c: int a[5]; ... file2.c: extern int *a; ... This one compiles fine, but just watch out at run-time ! I think, that "intimate relationships between arrays and pointers" should be cool off a little bit for the sake of stronger typing. Ed Gokhman