Использование элементов структуры
Чтобы присвоить значение элементу или обратиться к значению элемента, используйте оператор 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:
// Описание открытых членов и методов класса
}