And now this pointer bullshit is confusing EVERYONE!

Guy Harris guy at sun.uucp
Wed Jul 2 07:08:01 AEST 1986


> > This was intended to allocate an array and assign it to a variable of type
> > ``pointer to array of (struct sfld).  I suspect the type is wrong but I'm
> > not sure how to decalre such a beastie; I suspect that it *does* *not*
> > *exist* *at* *all* in C, now that I've played with it.

> Wrongo.  "struct sfld (*cursf)[]" *is* a declaration of a pointer to an
> array of "struct sfld".

> Which was my point...

Your point, as stated in the portion of your article that I quote, is that
you suspected that there is no type "pointer to array".  There is such a type.

> > This could easily have been done correctly:
> > 
> > int array[3];	-- should declare a pointer followed by 3 integers,
> >                         with the pointer initialized to the 3 integers
> > int array[];	-- should decalre a pointer.
> 
> No, NO, *NO*, ***N*O****, ...

> If you had read more carefully and applied what you know of C, it would have
> been YES!!!  Think about it for awhile.  I was trying to make a language
> which is C-compatible but handles arrays correctly.  Don't like it?  Then
> why in the name of the Witness are you bitching about pointers-vs.-arrays???

Why in the name of "the Witness" (whatever *that* is) does providing these
useless pointers make your proposed language handle array "correctly"?  C
handles arrays well enough for me - an array is an array, and there is no
pointer involved.  What languages other than BCPL and maybe B declare
a pointer cell like this?  PASCAL doesn't, Modula-2 doesn't, FORTRAN
doesn't, etc., etc..  Do they handle arrays incorrectly?

No, I *don't* like it.  Those pointers are useless, and certainly don't make
handing of arrays "correct".

> > > C should treat ``int array[]'' as a different type from ``int *ptr'',

> > It does.  That's what people have been trying to tell you!
> 
> Modulo some other type not being assignable (if it's initialized or given as
> array[n], it's a constant value), I am again correct.  Only if it can't be
> made a compile-time constant is it a pointer.  Clear?

No, it is not clear, because you are NOT correct, despite any feelings you
have to the contrary.  The *O*N*L*Y* place where declarations of

	int array[];

and

	int *ptr;

declare objects of the same type is if the "int array[]" is declaring a
formal parameter.  The only other place where "int array[]" can be used
is as an external declaration, in which case it declares an *array* (NOT a
pointer) of unspecified size; the size is set by the external DEFINITION of
"array", in this or some other module.

> C doesn't *have* arrays.  ``int a[3]'' decalres three ints and a constant
> pointer to the first.  If it declared it as an ARRAY none of this would be a
> problem.

The above statement is completely false, unless you have a VERY strange
defnition of an array.  What is an array "int a[3]" other than three ints?

In YOUR proposed language, "int a[3]" may declare a pointer.  In C, there is
no pointer declared.  The expression "a" is an ARRAY-valued expression (if
you don't believe me, try reading the ANSI C draft), which is coerced in MOST
circumstances (NOT all - in the expression "sizeof a", it is not so coerced,
and "sizeof a" has the value 3*sizeof(int)).

> I maintain that C doesn't support arrays, it merely fakes something with
> semantics similar in SOME contexts.

The only difference between C arrays and arrays in some other languages is
that array-valued expressions are coerced, in most cases, to a pointer-valued
expression.  That seems to cause some people problems.  Other people have
no problem with it at all.

> 	int a[3];			-->	(a[0])(a[1])(a[2])
> 	int *b = malloc(3*sizeof (int))	-->	(b[0])(b[1])(b[2])
> 		THESE are different??? -----------^^^^^^^^^^^^^^

No, they're not different - BUT the latter is not the layout of "b", but what
"b" *points to*.  "a" is an array-valued expression, which is is in most
circumstances coerced to a pointer-valued *expression* - said expression
does not *have* a storage location.  "b" is a pointer-valued expression
which *does* have a storage location.  "a", in those circumstances when it
is NOT coerced to a pointer-valued expression, has a storage layout which
is NOT the same as the storage layout of "b".  End of discussion.

> +--------------------^^^^^^^^^^^  Golly gee, you might even understand!

I've understood C arrays and pointers from the beginning.  Your condescending
tone is offensive and inappropriate, since you don't seem to understand
them.

> Which is what I am saying is a mistake.  Glad you finally noticed.
> Further flames to /dev/null.  C is just plain a botch.

I've considered C arrays to have a problem for a while, because some people
have trouble understanding them.  If you want to consider C to be "just
plain a botch" because of this, fine.
-- 
	Guy Harris
	{ihnp4, decvax, seismo, decwrl, ...}!sun!guy
	guy at sun.com (or guy at sun.arpa)



More information about the Comp.lang.c mailing list