char *a[]={"diamonds","clubs","spades","hearts"}; char **p[]={a+3,a+2,a+1,a}; char ***ptr=p; cout<<*ptr[2][2];
почему он отображает h и, пожалуйста, объясните, как реализуется двумерный массив ptr и его элементы
Обратите внимание, что x[y] связывается сильнее, чем *x, поэтому выражение *ptr[2][2] интерпретируется как *(ptr[2][2]).
x[y]
*x
*ptr[2][2]
*(ptr[2][2])
Также обратите внимание, что x[y] == *(x+y).
x[y] == *(x+y)
Следовательно
*(ptr[2][2]) == *(p[2][2]) // ptr = p == *((a+1)[2]) // p[2] == a+1 == *(*(a+1+2)) // x[y] == *(x+y) == *(*(a+3)) // 1+2 == 3 == *(a[3]) // *(x+y) == x[y] == *("hearts") // a[3] == "hearts" == "hearts"[0] // *x == *(x+0) == x[0] == 'h'
См. Отличный ответ KennyTM для объяснения ... но я подумал, что это было бы идеальным случаем для того, чтобы исповедовать использование вашего отладчика для "визуализации" памяти ... и дать простой ответ на этот тип вопросов.
альтернативный текст http://img717.imageshack.us/img717/5536/callstack.png