Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Семестр_2_С++.doc
Скачиваний:
4
Добавлен:
23.04.2019
Размер:
217.09 Кб
Скачать

7.6. Указатели на указатели

Как всякая переменная, переменная типа указатель имеет собственный адрес в памяти. Следовательно, указатель может содержать адрес другого указателя. Т.е. можно объявить указатель на переменную типа указатель:

Тип ** ИмяУказателя ;

Например:

int **p;

Объявленный указатель p может содержать адрес указателя на переменную типа int. Адрес указателя может быть получен с помощью унарной операции &, например:

int a = 10, *p, **p1;

p = &a;

p1 = &p;

После выполнения этих операторов указатель p1 будет содержать адрес указателя p, содержащего адрес переменной a со значением 10.

Можно объявить указатель на указатель на указатель и так далее. Для этого при объявлении перед указателем следует поставить нужное количество звездочек.

7.7. Массивы указателей и двумерные массивы

Указатели могут быть объединены в массивы. Массив указателей фиксированных размеров вводится одним из следующих объявлений:

Тип * ИмяМассива [Размер];

Тип * ИмяМассива[] = Инициализатор;

Тип * ИмяМассива[Размер] = Инициализатор;

Например:

int* p[10];

Массивы указателей часто применяются для работы с многомерными массивами. Если одномерный массив - область памяти с набором последовательно идущих элементов, то многомерный массив - это набор одномерных массивов.

Двумерный массив - наиболее простой и часто употребляемый вид многомерного массива. Двумерный массив может быть представлен как одномерный массив, элементами которого в свою очередь являются одномерные массивы. Так

int A[N][M];

означает, что объявлен одномерный массив с именем A размера N, каждый элемент которого является одномерным целочисленным массивом размера M. Указанный массив можно использовать, например, для работы с матрицей из N строк и M столбцов. Таким образом, можно сказать, что двумерный массив состоит из N одномерных массивов размера M и массива указателей размера N. A[0], A[1], ,A[N-1] – указатели на строки матрицы.

Имя двумерного массива является константным указателем. Указатели на строки - также константные указатели.

Во многих задачах при работе с двумерными массивами следует применять массивы указателей. Например, в задаче перестановки строк матрицы достаточно поменять местами указатели на строки в массиве указателей на строки.

Пример 7.4. Дана целочисленная квадратная матрица порядка n. Поменять местами строки: первую и последнюю, вторую и предпоследнюю и т.д. по направлению к центру.Вывести на экран исходный и полученный результаты.

Текст программы.

#include <iostream.h>

#include <stdlib.h>

const int n=6;

void InitMatrix (int[][n]);

void DisplayMatrix ( int* []);

void Perestanovka ( int*[]);

int main()

{ int Matrix[n][n];

int * Uk[n];

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

Uk[i]=Matrix[i];

InitMatrix(Matrix);

cout<<"\n\tИсходная матрица\n";

DisplayMatrix(Uk);

Perestanovka (Uk);

cout<<"\n\tРезультирующая матрица\n";

DisplayMatrix(Uk);

system("pause");

return 0;

}

void InitMatrix (int Matr[][n])

{

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

for(int j = 0; j < n; j++)

Matr[i][j]= i + 1;

return;

}

void DisplayMatrix ( int *Matrix[])

{

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

{

for(int j=0; j<n; j++)

{

cout.width(4);

cout<<Matrix[i][j];

}

cout<<endl;

}

}

void Perestanovka(int *Uk[])

{

for(int i=0; i<n/2; i++)

{

int *x=Uk[i];

Uk[i]=Uk[n-1-i];

Uk[n-1-i]=x;

}

}