Ссылки и массивы 4.1.
char *c[] = { "ENTER", "NEW", "POINT" "FIRST" }; | Описатель *c[] приводится к символу, значит, c[] указывает на символ и c - массив ссылок на символ. Элементы инициируются так, что они указывают на массивы символов "ENTER", "NEW", "POINT" и "FIRST". |
char **cp[] = { c+3, c+2, c+1, c }; | Описатель **cp[] соответствует символу, *cp - ссылке на символ и cp[] - ссылке на ссылку на символ. Элементы cp инициируются так, что они указывают на элементы c. |
char ***cpp = cp; | Описатель ***cpp дает символ, **cpp - ссылку на символ, наконец, *cpp - ссылка, указывающая на ссылку на ссылку на символ. |
Рис 4.1 показывает взаимосвязь между cpp, cp и c.
Рис.4.1 |
Ссылки и массивы 4.2.
*(*(++cpp)) | Увеличим cpp, а затем проследим цепочку ссылок (рис.4.2-1). |
(*(--(*(++cpp))))+3 | Увеличим cpp, по ссылке дойдем до cp[2], уменьшим cp[2], по ссылке дойдем до c[0] и эту ссылку проиндексируем значением 3 (рис.4.2-2). |
(*(cpp[(-2)]))+3 | Индексируя cpp значением -2, получим cp[0], по ссылке дойдем до c[3] и проиндексируем его значением 3 (рис.4.2-3). |
((cpp[-1])[-1])+1 | Индексируя cpp значением -1, получим cp[1], снова индексируем c -1 и доходим до c[1], эту последнюю ссылку индексируем значением 1 (рис.4.2-4). |
О ссылках. Если вы правильно решили последнюю задачу, то знаете все, что нужно знать о механизме использования ссылок. Сила ссылок заключается в их универсальности: ссылки можно связывать друг с другом, получая бесконечно разнообразные сложные структуры данных. Но опасность ссылок как раз и заключается в их силе: сложные цепочки ссылок редко бывают понятными и еще реже верными.
Рис.4.2-1 |
Рис.4.2-2 |
Рис.4.2-3 |
Рис.4.2-4 |