This is what I found during my learning period:
#include
using namespace std;
int dis(char a[1])
{
int length = strlen(a);
char c = a
C will not only transform a parameter of type int[5]
into *int
; given the declaration typedef int intArray5[5];
, it will transform a parameter of type intArray5
to *int
as well. There are some situations where this behavior, although odd, is useful (especially with things like the va_list
defined in stdargs.h
, which some implementations define as an array). It would be illogical to allow as a parameter a type defined as int[5]
(ignoring the dimension) but not allow int[5]
to be specified directly.
I find C's handling of parameters of array type to be absurd, but it's a consequence of efforts to take an ad-hoc language, large parts of which weren't particularly well-defined or thought-out, and try to come up with behavioral specifications that are consistent with what existing implementations did for existing programs. Many of the quirks of C make sense when viewed in that light, particularly if one considers that when many of them were invented, large parts of the language we know today didn't exist yet. From what I understand, in the predecessor to C, called BCPL, compilers didn't really keep track of variable types very well. A declaration int arr[5];
was equivalent to int anonymousAllocation[5],*arr = anonymousAllocation;
; once the allocation was set aside. the compiler neither knew nor cared whether arr
was a pointer or an array. When accessed as either arr[x]
or *arr
, it would be regarded as a pointer regardless of how it was declared.