From: Keith Thompson on
Robert A Duff <bobduff(a)shell01.TheWorld.com> writes:
> Keith Thompson <kst-u(a)mib.org> writes:
[...]
>> Yes. In fact, C doesn't have pass by reference as a language feature;
>> *all* function arguments are passed by value.
>>
>> For structs, it's very common in C to do the equivalent of
>> pass-by-reference, by explicitly passing the address of the struct
>> object. This is partly because very old versions of C didn't
>> support struct parameters.
>
> Which version of C (when?) introduced (by-copy) struct params?

It appeared in the 1989 ANSI C standard. It was undoubtedly
implemented in some compilers a few years before that. K&R1
(Kernighan & Ritchie, "The C Programming Language, 1st edition, 1978)
had structs, but didn't allow them to be assigned or passed as
arguments.

To be clear, C has *never* allowed structs to be passed by reference
implicitly, though it's always allowed the equivalent by explicit
coding.

>> I find it a bit odd that Ada imposes a pass-by-pointer convention for
>> C structs.
>
> It was a mistake. Partly my fault. I was thinking that it's common in
> C to pass struct params by explicitly passing a pointer-to-struct, so
> Ada should mimic that. Bad idea. By the time we realized the mistake,
> it was too late to fix (compatibility!), so we invented C_Pass_By_Copy
> as a workaround.
>
>> (No, C arrays aren't passed by reference. C array expressions, in
>> most contexts, are implicitly converted to pointers; the resulting
>> pointer can be passed by value.)
>
> Yeah. In other words, C arrays aren't passed, period.
> That's another bad idea, and it's not my fault. ;-)

Right, C arrays are very much second-class citizens, almost
always manipulated indirectly via pointers. (There's a common
misconception that C arrays and pointers are the same thing.
They most definitely are not. See section 6 of the comp.lang.c FAQ,
<http://www.c-faq.com>, for the details.)

--
Keith Thompson (The_Other_Keith) kst-u(a)mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"