Первый случай - это обычный случай: ptr
- указатель на первый элемент массива array
, и он индексируется (используя *(ptr+2)
, который является синонимом для ptr[2]
) для доступа ктретий элемент этого массива.
Второй случай придуман: arr_ptr
- указатель на массив (enitre) array
.Сначала разыменовывается (с *arr_ptr
) для получения самого массива, который затем используется в качестве аргумента для двоичного +
, что приводит к неявному преобразованию его в (безымянный) указатель на его первый элемент, который затеминдексируется таким же образом *(<nameless pointer>+2)
и дает тот же результат.
Сделав эти неявные преобразования явными, вы могли бы написать
int *ptr = &array[0];
std::cout<<*(ptr+ 2);
int (*arr_ptr)[10] = &array;
std::cout<<*( &(*arr_ptr)[0] + 2 );