Cтруктуры и указатели

Указатели в структуре.

 

Пусть объявлена следующая структура:

struct tst { char *t;

int m;

float *ard;

float per;

int *p;

} S1;

Перед использованием полей-указателей их надо инициализировать. Один из способов сделать это — использование операции new. С помощью операции S1.t=new char[20]; резервируем память для размещения строки из 20 символов, и адрес её первого байта размещаем в поле структуры t. Для размерности строки можно использовать не только константу, а и переменную, которую необходимо предварительно определить, например, ввести:

unsigned l; cin>>l; S1.t=new char[l];

После этого строку можно вводить (gets(S1.t);) или определить её с помощью функци: strcpy(S1.t, “The first testing”); Доступ к символам строки выполняется с помощью индексов: S1.t[j], где j может принимать значения от 0 до length(S1.t).

Пусть ard— адрес динамического одномерного массива размерности m, включённой в качестве поля структуры. Сначала определяем эту размерность, например, вводим её: cin>>S1.m;, а затем резервируем память для массива: S1.ard=new float [S1.m]; Доступ к элементам такого массива осуществляется также, как и к элементам статического массива. Например, для ввода записываем: for (int j=0; j<S1.m; j++) cin>>S1.ard[j];

В структуре может быть переменная-указатель, в которой хранится адрес переменной простого типа (int *p;). Тогда перед использованием такой переменной необходимо определить значение этого адреса. Это можно сделать одним из следующих способов:

a) с помощью операции new: S1.p=new int;

b) можно использовать адрес ранее определённой переменной:

int b; S1.p=&b;

c) полю можно присвоить ранее определённый адрес:

int *q=new int; S1.p=q;

d) переменную–указатель можно инициализировать с помощью статического массива, имя которого является адресом его начала: int a[10]; S1.p=a;

Доступ к содержимому ячейки, адрес которой находится в S1.p, осуществляется с помощью операции разыменование, например, *(S1.p)=3; или можно без скобок: *S1.p=3; Здесь операция “*” относится к полю структуры, т.е. к переменной p, а не к S1. Но для элементов массива (вариант d) такая операция не нужна: S1.p[j]=5;