To fully understand the workings of C you must know that pointers and arrays are related.
An array is actually a pointer to the 0th element of the array. Dereferencing the array name will give the 0th element. This gives us a range of equivalent notations for array access. In the following examples, arr is an array.

There are some differences between arrays and pointers. The array is treated as a constant in the function where it is declared. This means that we can modify the values in the array, but not the array itself, so statements like arr ++ are illegal, but arr[n] ++ is legal.
Since an array is like a pointer, we can pass an array to a function, and quite happily modify elements of that array. The elements are already being accessed by a pointer (though this is hidden from the programmer by C's array implementation). It is also possible to pass parts of an array to another function. If average is a function which expects an array argument, and arr is an array, then the call
average(arr + 5);will pass part of arr starting with arr[5] to the function.
A function which expects to be passed an array can declare that paramater in one of two ways.

Either of these definitions is independent of the size of the array being passed. This is met most frequently in the case of character strings, which are inplemented as an array of type char. This could be declared as char string[]; but is most frequently written as char *string; In the same way, the argument vector argv is an array of strings which can be supplied to function main. It can be declared as one of the following.

Don't panic if you find pointers confusing. While you will inevitably meet pointers in the form of strings, or as variable arguments for functions, they need not be used for most other simple types of programs.