Использование элементов структуры

Чтобы присвоить значение элементу или обратиться к значению элемента, используйте оператор C++ точку (.). Например, следующие операторы присваивают значения различным элементам переменной с именем worker тута employee;

worker.employee_id = 12345;

worker.salary = 25000.00;

worker.оffice_number = 102;

Указатели и соответствующие операции

Указатель -это переменная, значением которой является адресдругой переменной. Так как указатель может ссылаться на переменные разных типов, с указателем в языке Си связывается тип того объекта, на который он ссылается. Для описания указателей используется операция косвенной адресации *. Например, указатель целого типа ukописывается так: int *uk.

Унарная операция &, примененная к некоторой переменной, показывает, что нам нужен адрес этой переменной, а не ее текущее значение. Если переменная ukобъявлена как указатель, то оператор присваивания uk=&xозначает: "взять адрес переменной x и присвоить его значение переменной-указателю uk".

Унарная операция *,примененная к указателю, обеспечивает доступ к содержимому ячейки памяти, на которую ссылается указатель. Например, *ukможно описать словами как "то, что содержится по адресу, на который указывает uk".Указатели могут использоваться в выражениях. Если, например, переменная ukуказывает на целое x, то *ukможет во всех случаях использоваться вместо x;так, *uk+1увеличивает xна единицу, а *uk=0равносильно x=0.Два оператора присваивания uk=&x; y=*uk;выполняют то же самое, что и один оператор y=x.Польза от применения указателей в таких ситуациях, мягко выражаясь, невелика.

Пример

/*обмен a и b */ void obmen(int *x,int *y) { int t; t=*x; *x=*y; *y=t; } #include <iostream.h> void main() { int a,b; a=3;b=7; obmen(a,b); cout<<"a=”<<a<< “b="<<b; }

Указатели и массивы

Наиболее полно их преимущества при обработке массивов и, в частности, символьных строк. Указатели и массивы тесно связаны друг с другом. Прежде чем рассмотреть эту связь подробно, заметим, что если uk- некоторый указатель, то uk++увеличивает его значение и он теперь указывает на следующий, соседний адресуемый объект. Значение ukиспользуется в выражении, а затем увеличивается. Аналогично определяются операции uk--, ++uk, --uk.В общем случае указатель ukможно складывать с целым числом i.Оператор uk+=iпередвигает ссылку на iэлементов относительно текущего значения. Эти конструкции подчиняются правилам адресной арифметики.

А теперь вернемся к массивам. Пусть имеется описание int a[5];Оно определяет массив размером 5 элементов, т.е. пять последовательно расположенных ячеек памяти a[0], a[1], a[2], a[3], a[4].Адресс i-го элемента массива равен сумме адреса начального элемента массива и смещения этого элемента на iединиц от начала массива. Это достигается индексированием: a[i]-i-й элемент массива. Но доступ к любому элементу массива может быть выполнен и с помощью указателей, причем, более эффективно. Если uk -указатель на целое, описанный как int *uk, то ukпосле выполнения операции uk=&a[0]содержит адрес a[0],а uk+iуказывает на i -й элемент массива. Таким образом, uk+iявляется адресом a[i],а *(uk=1)- содержимым i- гоэлемента(операции *и & более приоритетны, чем арифметические операции). Так как имя массива в программе отождествляется с адресом его первого элемента, то выражение uk=&a[0]эквивалентно такому: uk=a.Поэтому значениеa[i]можно записать как *(a+i).Применив к этим двум элементам операцию взятия адреса, получим, что &a[i]и a+iидентичны.

При определении статического массива:

тип имя_массива [количество_элементов] имя_массива

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

Формирование массивов с переменными размерами можно организовать с помощью указателей и средств для динамического выделения памяти. Эти средства описаны в библиотеке <alloc.h>. Функции malloc() и calloc() динамически выделяют память в соответствии со значениями их параметров и возвращают адрес начала выделенного участка памяти. Тип возвращаемого значения указателя void *. Его можно преобразовать к указателю любого типа с помощью явного приведения типа. Функция free(void *) освобождает память, выделенную с помощью malloc() или calloc().

int *p;

p=(int *)malloc(size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером size байт.

p=(int *)calloc(n, size); //Указателю на целое p присваивается адрес начала выделенной области памяти размером n*size байт.

free(p); //Освобождает выделенную по адресу p память.

Преобразование указателя любого типа к типу void * осуществляется автоматически, так что в качестве фактического параметра можно подставить указатель любого типа без явного приведения типов.

Пример формирования одномерного динамического массива

#include <alloc.h>

main()

{ float *p,d;

int i,n;

cout<<”vv n”;

cin>>&n;

p=(float *)malloc(n*sizeof(float));

for (i=0;i<n;i++)

{cout<<"x[d]="<<i;

cin>>,&d;

p[i]=d;

}

for (i=0;i<n;i++)

{ if (i%4==0) cout<<"\n";

cout<<"\t x[d]="<<i<<p[i]);

}

free(p);

getch();

}

Если в качестве функции передается имя массива, то оно фактически определяет адрес начала массива, т.е. является указателем.

Классы.

Класс - составной тип данных, элементами которого являются функции и переменные. В основу понятия класс положен тот факт, что «над объектами можно совершать различные операции». Свойства объектов описываются с помощью полей классов, а действия над объектами описываются с помощью функций, которые называются методами класса. Класс имеет имя, состоит из полей, называемых членами класса и функций - методов класса.

Описание класса имеет следующий формат:

class name // name – имя класса

{

private:

// Описание закрытых членов и методов класса

protected:

// Описание защищенных членов и методов класса

public:

// Описание открытых членов и методов класса

}

Наши рекомендации