You can perform arithmetic operations on a pointer
Memories are allocated in terms of a block for an array. This means the 1st, 2nd, etc.. elements are all located adjacent to each other in the memory. Due to this reason, we can perform pointer arithmetic to efficiently access and traverse data.
Pointer arithmetic allows us to perform arithmetic operations on a pointer.
int arr[3] = {17, 34, 51};
&arr[0] // 0x..bb9c
&arr[0] + 1 // 0x..bba0 (move 4 bytes from [0])
&arr[0] + 2 // 0x..bba4 (move 8 bytes from [0])
Since name of the array itself is already a pointer, we can drop some of the unnecessary symbols.
int arr[3] = {17, 34, 51};
printf("%p\n", arr); // 0x..eb9c
printf("%p\n", &arr[0]); // 0x..eb9c
// produces same result
printf("%p\n", arr); // 0x..bb9c
printf("%p\n", arr+1); // 0x..bba0
printf("%p\n", arr+2); // 0x..bba4
Pointer arithmetic in array is possible because they hold elements of same type.