The answer to your question is to replace this:
CountEvenNumbers(numbers[length], length);
for this
CountEvenNumbers(numbers, length);
However, if you continue coding, a skill that may prove invaluable is to decrypt error / error messages:
"c: 2: 5: note: expected 'int *', but the argument is of type 'int'"
"c: 28: 1: warning: passing argument 1 of" CountEvenNumbers "makes a pointer to an integer without cast [enabled by default]"
So what does that mean? It states that on line 28 ( CountEvenNumbers( numbers[length] , length ); ) it was expected that you would throw an argument 1, that is, you passed it what he did not expect. So, you know that something is wrong with the first argument.
The trick here is another line: expected 'int *' but argument is of type 'int' He says: "I need a pointer to an integer, but you gave me just an integer." This is how you know that you are going through the wrong type.
So you have to ask yourself what type of argument is 1? You know if you want to access an element inside an array, you need to use [] , (you did this on lines 20 and 25 of your code), therefore, by passing numbers[length] your function, your attempt to pass it one element 1 instead the full array that he expects.
The other half of this is expected 'int *' , why does your function expect to get a pointer to an int? Good thing, since in C, when you pass an array (type), it decays to a pointer to (type).
1, of course, the number [length] is not really an element in your array, it overflows it.