Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы ОАиП.docx
Скачиваний:
137
Добавлен:
09.03.2016
Размер:
139.71 Кб
Скачать

60.Многоуровневые указатели.

·Рассмотрим определение переменной: double **pp;

·В соответствии принципом контекстного определения pp нужно интерпретировать как переменную, при косвенном обращении к которой получается указатель на переменную типа double, то есть как указатель на указатель или адрес указателя.

Но

·Поскольку любой указатель в Си может ссылаться как на отдельную переменную, так и на область памяти (массив), то в применении к двойному указателю получаются 4 вариантаструктур данных, а именно:  1) указатель на одиночный указатель на переменную типа double;  2) указатель на одиночный указатель на массив переменных типа double;  3) указатель на массив, содержащий указатели на одиночные переменные типа double;  4) указатель на массив, содержащий указатели на массивы переменных типа double.

·Третья интерпретация позволяет нам использовать двойной указатель для работы с известными нам массивами указателей следующим образом:  double **pp, *pd[20]; pp = pd; // или pp = & pd[0]; *(pp+i) // или pp[i] **(pp+i) // или *pp[i] Здесь повторяется та же самая система эквивалентности обычных массивов и указателей - типов double* и double[], но применительно не к массивам обычных переменных, а к массивам указателей.

Короче говоря, типы double** и double *[] различаются так же, как указатель-переменная и указатель-константа.

·Массив указателей типа double *[] является статической структурой данных, размерность которой определяется при трансляции. Двойной указатель типа double** может ссылаться и на динамический массив указателей, который создается во время работы программы под заданную размерность:

double **create(int sz){ double **pp,*q; int i;// создать динамический массив указателей размерностью sz+1 pp = (double **)malloc(sizeof(double *)*(sz+1)); for (i=0; i< sz; i++){ // создать динамическую переменную q = (double *)malloc(sizeof(double)); *q = i; pp[i] = q; // указатель занести в динамический массив} pp[sz] = NULL; return(pp); // возвратить указатель на динамический массив указателей}

61.Динамические матрицы.

Статические массивы, аля int a[3]={3,5,7}, хороши своей простотой. Но бывают случаи, когда "статика" массивов мешает. Например, Вы хотите написать программу перемножения матриц любых порядков. Вот тут статический массив не просто мешает - его применение здесь практически невозможно! Итак, встречайте - динамический массив! Что же это такое? Это когда Вы во время работы своей программы (а не во время разработки) можете менять размеренность массивов. И начнем мы с одномерных (векторных) массивов.

int x = 5; // тут задается "длина" массива (при заданном значении нам доступно 5 элементов int) int *arr = new int[x]; // это создание // а это проверка arr[0]=1347; arr[4]=-124; cout << arr[0] << endl << arr[4] << endl;

Освобождение памяти (или удаление, что не совсем точно) производиться так:

delete[]arr; Двумерные (матричные) массивы создаются немногим сложнее:

int x = 5; int y = 5; /* размеры масива */ int **arr = new int*[x]; for(int i=0;i<x;i++) arr[i]=new int[y];

"Удаление" производиться так:

for(int i=0;i<x;i++) delete[]arr[i]; delete[]arr;