> Why `alphabet_pointer = alphabet;` points exactly to the first element in the array? Why not the whole array?
Someone decided it has to be so, because it is pretty convenient. Usually when dealing with an array, you want to do things with its elements and therefore it's extremely convenient that an expression with array type is converted to a pointer to the array's first element. If that didn't happen, then you'd very often have one extra layer of annoyance to go through in order to access array elements.
> Why not the last?
The first element is convenient because then you can reach for the other elements by adding a zero-based offset or index to the pointer. How often do you operate on an array starting from its end? How often do you like to work with negative indices? That's why not the last.
> Can we have a pointer that accepts a whole array?
We can have a pointer that points to a whole array:
int a[50];
int (*p)[50] = &a;
printf("%zu %zu %zu\n", sizeof a, sizeof a / sizeof *a, sizeof *a);
printf("%zu %zu %zu\n", sizeof *p, sizeof *p / sizeof **p, sizeof **p);
> 200 50 4
> 200 50 4
Someone decided it has to be so, because it is pretty convenient. Usually when dealing with an array, you want to do things with its elements and therefore it's extremely convenient that an expression with array type is converted to a pointer to the array's first element. If that didn't happen, then you'd very often have one extra layer of annoyance to go through in order to access array elements.
> Why not the last?
The first element is convenient because then you can reach for the other elements by adding a zero-based offset or index to the pointer. How often do you operate on an array starting from its end? How often do you like to work with negative indices? That's why not the last.
> Can we have a pointer that accepts a whole array?
We can have a pointer that points to a whole array: