There is generally no difference between using an index or using a pointer. Using pointers is technically faster, but using an index will usually result in the same code once the compiler has optimized it (unless it is really bad at optimizing or that the context makes the preservation of the index value necessary).
So, the idea here is that you should use whatever feels more natural and clear in the context. For example, if I want to fill an array with sequence numbers, I would do this:
int number_seq[100];
for(int i = 0; i < 100; ++i)
number_seq[i] = i;
Instead of this:
int number_seq[100];
for(int* p = number_seq; p != number_seq + 100; ++p)
*p = (p - number_seq);
Because the first one is much clearer and more natural. The resulting compiled code is likely to be identical in both cases.
In other words, this is just one of these cases where you can trust the compiler to produce pretty much the best code possible, and all you have to worry about is making it "human-friendly".
Also, in C++, there is strong emphasis on the concept of "iterators", which are a kind of abstract generalization of pointers in the context of traversing a sequence of values (array, list, etc.). And in that sense, using pointers to traverse the array is a "natural" thing to do in C++, but obviously, index-based traversals are preferred in many contexts similar to the example above (and for example, …