Записи 1.1.
static struct S1 { char c[4], *s; } s1 = { "abc", "def" }; | Тип записи S1 относится к записи, содержащей массив символов c длиной 4 и ссылку на символ s. Переменная s1 - это некоторый экземпляр записи S1, инициируемый следующим образом:
char c[4] = "abc", *s = "def"; Поскольку запись была определена как static, то ее можно инициировать при определении. |
static struct S2 { char *ss2; struct S1 ss1; } s2 = { "ghi", { "jkl", "mno" } }; | Тип записи S2 относится к записи, содержащей ссылку на символ cp и экземпляр записи S1 - ss1. Переменная-запись s2 есть экземпляр записи типа S2, инициированный следующим образом:
char *ss2 = "ghi"; struct S1 ss1 = {"jkl","mno"}; |
Рис 1.1 изображает записи s1 и s2.
Рис 1.1 |
Записи 1.2.
PRINT2(c, | Нужно напечатать какой-то символ. |
s1.c[0], | Это первый символ из элемента c записи s1 (рис.1.2-1). |
*s1.s | Это символ, на который указывает элемент s записи s1 (рис.1.2-2). |
Рис.1.2-1 |
Рис.1.2-2 |
Записи 1.3.
PRINT2(s | Нужно напечатать некоторую строку. |
s1.c | Это строка, на которую указывает элемент c записи s1. Напомним, что c=&c[0] (рис.1.3-1). |
s1.s | Это строка, на которую указывает элемент s записи s1 (рис.1.3-2). |
Рис.1.3-1 | Рис.1.3-2 |
Записи 1.4.
Рис.1.4-1 s2.cp | Рис.1.4-2 (s2.ss1).s |
Записи 1.5.
Рис.1.5-1 ++(s2.cp) | Рис.1.5-2 ++((s2.ss1).s) |
Записи 3.1.
struct S1 { char *s; struct S1 *s1p; }; | Тип записи S1 относится к записи, содержащей ссылку на символ s, и ссылку s1p на запись типа S1. |
static struct S1 a[] = { { "abcd", a+1 }, { "efgh", a+2 }, { 'ijkl", a } }; | Массив a из трех элементов, представляющих собой записи типа S1, определен как статический, поэтому в определении его можно инициировать. |
struct S1 *p[3]; | Выражение *(p[]), если оно встречается в операторе программы, относится к записи S1. Значит p[] - ссылка на запись S1 и p - массив из трех элементов, указывающих на записи типа S1. |
На рис.3.1 изображены массивы a и p.
Рис.3.1. |
Записи 3.2.
for (i=0; i | i принимает значения 0, 1, 2. |
p[i] = a[i].s1p; | В i-й элемент p копируется ссылка из элемента s1p записи, которая есть i-й элемент a (рис.3.2-1). |
Рис.3.2-1 |
Рис.3.2-2 |
Записи 3.3.
swap(*p,a); | Так как p указывает на p[0], то *p относится к содержимому p[0] или &a[1], а дает &a[0]. |
temp=(&a[1])->s | Эквивалентно temp=a[1].s. |
(&a[1])->s=(&a[0])->s | Или a[1].s=a[0].s. |
(&a[0])->s=temp | Функция swap меняет местами строки, на которые указывают элементы s ее аргументов (рис. 3.3-1). |
Рис.3.3-1 |
Рис.3.3-2 |
Рис.3.3-3 |
Записи 3.4.
swap(p[0],p[0]->s1p); | Элемент p[0] содержит &a[1], (p[0])->s1p содержит &a[2] (рис.3.4-1). |
Рис.3.4-1 |
Рис.3.4-2
Рис.3.4-3
Рис.3.4-4