массив указателей - PullRequest
       8

массив указателей

0 голосов
/ 20 апреля 2010
char *a[]={"diamonds","clubs","spades","hearts"};
char **p[]={a+3,a+2,a+1,a};
char ***ptr=p;
cout<<*ptr[2][2];

почему он отображает h и, пожалуйста, объясните, как реализуется двумерный массив ptr и его элементы

Ответы [ 2 ]

12 голосов
/ 20 апреля 2010

Обратите внимание, что x[y] связывается сильнее, чем *x, поэтому выражение *ptr[2][2] интерпретируется как *(ptr[2][2]).

Также обратите внимание, что 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'
5 голосов
/ 20 апреля 2010

См. Отличный ответ KennyTM для объяснения ... но я подумал, что это было бы идеальным случаем для того, чтобы исповедовать использование вашего отладчика для "визуализации" памяти ... и дать простой ответ на этот тип вопросов.

альтернативный текст http://img717.imageshack.us/img717/5536/callstack.png

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...