Приведем несколько примеров, иллюстрирующих применение указателей.
Пример 1. Инициализация вещественного "массива" размерностью 32000 элементов.
#include<iostream.h>
void main ()
{
// float x[32000]; Наличие этого описания приведет к ...
//Выделение места для массива и размещение адреса начала
//массива в переменной g.
float *g=new float [32000];
for (int i=0; i<32000; i++)
{ *(g+i) = i;
cout<<*(g+i)<<" ";
}
delete[] g;//Возврат памяти в "кучу".
}
Пример 2. Использование указателей для работы со списками.
Создадим сначала две динамические переменные:
R = new CT; Q = new CT;
А теперь построим список, содержащий два звена:
(*R).I = 15; (*Q).I = 20;
(*R).P = Q;
(*Q).P = NULL;
Результат:
Создадим еще один список: R1 = new CT; Q1 = new CT;
(*R1).I = 13;
(*Q1).I = 53;
(*R1).P = Q1;
(*Q1).P = NULL;
Результат:
Проиллюстрируем теперь схематически результат действия оператора присваивания:
(*R1).P = (*R).P;
#include<iostream.h>
typedef struct ct *POINTER; // Рекурсивная структура
typedef struct ct //данных.
{
int I;
POINTER P;
} CT;
POINTER R,Q,R1,Q1;
void main ()
{ // Создание первого списка.
R = new CT;
Q = new CT;
(*R).I = 15; (*Q).I = 20; (*R).P = Q; (*Q).P = NULL;
cout<<"Информационное поле второго звена списка: "
<<(*(*R).P).I<<endl;
// Создание второго списка.
R1 = new CT;
Q1 = new CT;
(*R1).I = 13; (*Q1).I = 53; (*R1).P = Q1; (*Q1).P = NULL;
cout<<"Информационное поле второго звена списка: "
<<(*(*R1).P).I<<endl;
// Работа со списками.
(*R1).P = (*R).P;
cout<<(*(*R1).P).I<<endl;
}