If the declaration of an array is visible, one can find its length by dividing its total size by the size of one element:
int squares[4]; int len = sizeof squares / sizeof squares[0];
Because squares above is
the name of an array, we can
obtain its length using sizeof squares,
which yields the total size as a number of chars. sizeof squares[0]
yields the size (in chars)
of one element, and since all the elements are of the
same size, the ratio of these two sizeofs is the
number of elements in the array:
void fill_array_with_square_numbers(int *first, int length); int squares[4]; fill_array_with_square_numbers(squares, sizeof squares / sizeof squares[0]);
(For arrays of chars,
the divisor can be omitted, since sizeof(char)
is defined to be 1.)
However, this technique doesn't work if the argument
to sizeof is only a
pointer that happens to point to an element of an array,
rather than an array name. Consider that such a pointer
looks identical to a pointer to a single object, as far
as the compiler is concerned — they don't contain any
information about the length. This is why the example
function above requires the length as a separate
argument: within the function, sizeof first would
only give the size of a pointer to an integer, not the
length of the array.