Arrays in C are not pointers. Arrays are [potentially large] contiguous blocks of memory - objects consisting of many smaller objects, called array elements.
As for "why not"... Arrays used to be pointers in B and BCPL languages - C's predecessors and forefathers. They were pointers in the very first sketchy version of C - "embryonic" C. However, C language wanted to introduce a concept of aggregate struct
types. If arrays were implemented as pointers in C, then struct
objects containing arrays would require non-trivial initialization ("construction") and would become non-copyable (even with memcpy
). That was considered unacceptable. This is what led to the redesign of the idea of an array in C. You can read about it on Dennis Ritchie's The Development of the C Language page (see "Embryonic C" section).
As for how much memory you can access through a pointer... Read about pointer arithmetic.
Raw arrays in C++ are virtually the same as they are in C.