To add to what Richard has said: the C Language Specification defines that the name of an array variable is a pointer to its first element.
So given this:
int arr[10];
These two statements are equivalent:
int *p1 = arr;
int *p2 = &(arr[0]);
This means that it is legal to treat any pointer to a type as an indexable array of that type - so passing an array to a function is done by declaring the parameter as a pointer, and then using an index within the function to access individual elements;
void PrintArray(int *arr, int n)
{
for (int i = 0; i < n; i++)
{
printf("%u\n", arr[i]);
}
}
Or as a pointer:
void PrintArray(int *arr, int n)
{
while(n-- > 0)
{
printf("%u\n", *arr++);
}
}
In either case, you can hand the array and it's size, and the function will work:
int myArray[10];
PrintArray(myArray, 10);