Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЯП - ПОИТ (Бахтизин) часть 1 редакт.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.76 Mб
Скачать

8.4. Указатели на структуры

Указатель на структуру объявляется с помощью символа *, который ставится перед именем самой структуры. Объявление:

struct base *p; // объявление указателя p на данные типа base

Указатели на структуры можно использовать, например, при передаче структуры функции. Поскольку при выполнении вызова функции структура помещается в стек, это требует затраты существенных ресурсов. Поэтому надо передавать не саму структуру, а указатель на неё, поскольку, когда функции передаётся указатель на структуру, то в стек попадает только адрес структуры, ресурсов тратится меньше и вызов функции осуществляется быстрее. Также такой способ позволяет изменять содержимое структуры, используемой в качестве аргумента.

Для получения адреса структурной переменной перед её именем нужно поставить оператор &.

Теперь, чтобы получить доступ к членам структуры нужно использовать оператор стрелка ->. Альтернативный способ доступа – использование оператора точка . , однако до этого необходимо разыменовать указатель на структуру, т.е. (*имя_указателя_на_структуру).имя_поля. Следующий пример показывает, как получить доступ к полям n и cost структурной переменной m1 через указатель *p:

struct base m1, *p = &m1;

p->n = 1; // Можно (*p).n = 1;

p->cost = 1.2; // Можно (*p).cost = 1.2;

Необходимо помнить, что оператор точка используется при работе с самой структурой, а оператор стрелка – при работе с указателем на структуру.

Выделение под структурную переменную динамической памяти:

p = (struct base*) malloc(sizeof(struct base));

p будет содержать адрес младшего байта выделенного блока памяти, равного размеру шаблона.

++p->cost; // это выражение увеличивает cost на 1,

// а не р, так как оно эквивалентно выражению

// ++(p->cost);

(++p)->cost; // сначала увеличится p на 1 до доступа к cost,

// т. е. увеличится p на sizeof тип

(p++)->cost; // увеличивает p после доступа к cost

8.5. Массивы структурных переменных

При объявлении массива структур в квадратных скобках пишется количество резервируемых для дальнейшего использования структур. Например, следующий код – создание 100 структур mas, каждая из которых состоит из 5 элементов:

struct base

{

int n;

char name[20];

float cost;

int quant;

char note[100];

};

struct base mas[100]; // объявление массива структур

// типа base из 100 элементов

Но нужно быть осторожным при использовании массивов структур, поскольку они занимают много места в памяти.

Оператор точка работает с элементами массива структур точно так же, как и с обычными структурными переменными.

mas[i].n = 10; // полю n i-той структуры присваивается

// значение 10

mas[i].name[j] = ‘a’; // j-тому элементу поля name

// i-той структуры

// присваивается значение ‘a’

Можно использовать для присвоения значений элементам массива указатель:

p = &mas[0]; // указателю p присваивается адрес

// первой структуры

(p+i)->n; // обращение к i-тому элементу, i увеличивается

// на sizeof(struct base).

Также одной операцией присваивания можно присвоить одной структуре данные, находящиеся в другой структуре:

mas[i] = mas[j];

Можно использовать указатель для присвоения значений элементов массива друг другу:

*(mas + i) = *(mas + j);