Partial answer:
There is one important difference between a pointer and an array, when considered as declared name. From K&R 2nd edition, chapter 5.3:
There is one difference between an array name and a pointer that must be kept in mind. A
pointer is a variable, so pa=a and pa++ are legal. But an array name is not a variable;
constructions like a=pa and a++ are illegal.
So an array declaration reserves space, while a pointer declaration doesn't.
Without the distinction between pointer and array, one couldn't reserve space for an array (though one could still use malloc etc).
Note that this doesn't extend to formal parameters (same chapter):
Within the called function, this argument is a local variable, and so an array name
parameter is a pointer, that is, a variable containing an address.
[...]
As formal parameters in a function definition, char s[]; and char *s;
are equivalent; we prefer the latter because it says more explicitly that the variable is a pointer.
I don't know if that was the reason for the split between arrays/pointers (and I actually do not know how B handles array allocation), and as I wrote in the comment I am not entirely sure if one can find out the reason in the first place, but the above is at least one important difference.
Also note, that as already pointed out in the comments, otherwise array indexing and pointer arithmetic are often entirely exchangeable:
a reference to a[i] can also be written as *(a+i). In evaluating a[i], C converts it to *(a+i) immediately; the two forms are
equivalent. Applying the operator & to both parts of this equivalence, it follows that &a[i] and
a+i are also identical: a+i is the address of the i-th element beyond a. As the other side of this
coin, if pa is a pointer, expressions might use it with a subscript; pa[i] is identical to *(pa+i).