Задачи по языку С


         

Пояснения:


Записи 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

p[0]->s, (*p)->s, (**p).s

Одно и то же можно сказать по-разному (рис.3.2-2).


Рис.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

p[0]->s, (*p)->s

(рис. 3.3-2)


Рис.3.3-2

(*p)->s1p->s

(рис. 3.3-3)


Рис.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

(p[0])->s


Рис.3.4-2

(*(++(p[0]))).s


Рис.3.4-3

++((*(++((*p)->s1p))).s


Рис.3.4-4




Содержание  Назад