- •7. Указатели, массивы
- •7.1. Понятие адреса
- •7.2. Указатели
- •7.3. Арифметические операции и операции сравнения
- •7.4. Указатели и одномерные массивы
- •7.5. Возвращение функцией нескольких значений
- •7.6. Указатели на указатели
- •7.7. Массивы указателей и двумерные массивы
- •7.8. Массивы динамической памяти Одномерные динамические массивы
- •Двумерные динамические массивы
- •8. Строки
- •9. Структуры
- •9.1. Объявление структуры
- •9.2. Вложенные структуры
- •9.3. Статические массивы в структурах
- •9.4. Статический массив структур
- •9.5. Структуры и указатели
- •9.6. Динамический массив структур
- •9.7.Ссылка на структуру
- •9.8. Структуры и функции
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;
}
}