while(a[it] != '\0'){
This loop ends when the element of the array is equal to the null terminator character.
const char a[5] = {'a', 'b', 'b', 'v', 's'};
const char b[4] = {'c', 'b', 'b', 'v'};
const char c[4] = {'c', 'b', 'b', 'v'};
None of your arrays contain a null terminator character. The loop won't stop on the elements, and it will access non-existing elements outside of the bounds of the array and the behaviour of the program is undefined. This is bad. Don't do this.
If you add null terminator to the arrays, then the function will successfully count the number of non-null-terminator characters that precede the first null-terminator:
const char a[6] = {'a', 'b', 'b', 'v', 's', '\0'};
//const char a[] = "abbvs"; // equivalent
printf("%d", arrSize(a)); // 5
Note that there is no need to write this arrSize because it's provided by the standard library under the name strlen.
When you pass a pointer to element of an array into a function, there is no general way to determine the size of the array using that pointer without relying on a terminator value such as in the case of null terminated strings.
When a function needs to access a non-terminated array of arbitrary length, a common C idiom is to pass that size into the function as an argument. Modern C++ idiom is to use std::span or equivalent which is essentially same except the compiler can deduce the size of an array.
You can determine the size of an array variable within the scope where the array is declared. A common C idiom is to divide sizeof the array with sizeof the element type. Modern C++ idiom is to use std::size. Example:
const char a[5] = {'a', 'b', 'b', 'v', 's'};,
void operate_on_array(const char *arr, size_t size);
// C
operate_on_array(a, sizeof a / sizeof *a);
// C++ with std::size
operate_on_array(a, std::size(a));
// C++ with std::span
operate_on_array(std::span<const char> arr);
operate_on_array(a);