There is a difference, consider:
int arr[] = { 5, 6, 7, 8, 9, 10 };
int * ptr = arr;
printf("%d\n", *ptr++);
printf("%d\n", *ptr++);
You might look at that and say, "why use an iterator, what's the difference?". In this example we know we can just point to the base address, and step through by incrementing the pointer(which will step sizeof(int) bytes). Using an iterator seems silly because it's just wrapping walking a pointer.
The key is, it's just wrapping walking a pointer in this case.
What if the underlying data wasn't contiguously allocated - you can't just increment a pointer anymore. What if it's a tree? What if it's a linked list?
The point of the iterator concept is that you can abstract the concern of how to walk a collection, and just rely on the standard exposed iterator methods. For users of your collection, they don't have to have any insight into how your collection stores elements.