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

       

Пояснения:


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

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



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