Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++.doc
Скачиваний:
27
Добавлен:
20.08.2019
Размер:
2.26 Mб
Скачать

Массивы указателей

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

Пример инициализации массива указателей существующими адресами

#include <iostream>

using namespace std ;

int main ( )

{

const int SIZE = 4 ;

int array [ SIZE ] = { 5, -3, 0, 17 } ;

// объявление массива указателей на целый тип

int* p [ SIZE ] ;

// инициализация массива указателей адресами

for ( int i = 0; i < SIZE; i++ ) p [ i ] = & array [ i ] ;

// вывод состояния массива указателей

for ( int i = 0; i < SIZE; i++ ) cout << p [ i ] << '\t' ;

cout << endl ;

// вывод значений через массив указателей

for ( int i = 0; i < SIZE; i++ ) cout << * p [ i ] << "\t\t" ;

cout << endl ;

return 0 ;

}

Для присвоения элементу массива указателей значения адреса переменной типа, на который он указывает, следует выполнить операцию взятия адреса (&) для переменной. Чтобы получить значение переменной, на которую указывает элемент массива указателей, необходимо разыменовать указатель.

Пример динамического формирования массива указателей

#include <iostream>

using namespace std ;

const int SIZE = 4 ;

int main ( )

{

// инициализация массива указателей адресами

// и значениями по выделенным адресам

int* p [ SIZE ], x ;

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

{

cout << "-> " ; cin >> x ;

p [ i ] = new int ( x ) ;

}

// вывод состояния массива указателей

for ( int i = 0; i < SIZE; i++ ) cout << p [ i ] << '\t' ;

cout << endl ;

// вывод значений через массив указателей

for ( int i = 0; i < SIZE; i++ ) cout << * p [ i ] << "\t\t" ;

cout << endl ;

// освобождение памяти

for ( int i = 0; i < SIZE; i++ ) delete p [ i ] ;

return 0 ;

}

Следует помнить:

- базовый тип массива указателей, тип в операторе new и тип переменной, адрес которой хранится в массиве указателей, должны совпадать;

- выделенные боки памяти должны быть освобождены после их использования;

-освобождается оперативная память для массива указателей с помощью оператора delete для каждого указателя отдельно.

Организация динамического двумерного массива

Динамический двумерный массив создается в процессе исполнения программы. Количество строк и количество столбцов двумерного массива определяется по ходу выполнения программы. Сначала выделяется блок памяти для массива указателей на количество строк матрицы. Далее в цикле выделяются блоки памяти размером на количество столбцов, начальные адреса которых передаются соответствующему указателю из массива указателей.

Пример создания динамического двумерного массива

#include <iostream>

using namespace std;

int main ( )

{

double** p ; // указатель на указатель

// ввод количества строк m и столбцов n

int m, n ;

cout << "Enter quantity of rows\t-> " ; cin >> m ;

cout << "Enter quantity of columns\t-> " ; cin >> n ;

// выделение памяти для массива указателей на строки

p = new double* [ m ] ;

// выделение памяти для элементов строк

for ( int i = 0; i < m; i++ ) p [ i ] = new double [ n ] ;

// заполнение матрицы значениями

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

for ( int j = 0; j < n; j++ ) cin >> p [ i ] [ j ] ;

// вывод матрицы

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

{

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

cout << p [ i ] [ j ] << '\t' ;

cout << endl ;

}

// освобождение памяти

for ( int i = 0; i < m; i++ ) delete [ ] p [ i ] ;

delete [ ] p ;

return 0 ;

}

Указатель на указатель р позволяет обращаться к элементам матрицы так, как если бы она была объявлена обычным способом. В конце программы выделенная память освобождается в два этапа:

1 этап: - в цикле освобождается память для каждой строки отдельно;

2 этап: - освобождается память от массива указателей.

Строки

Строка состоит из последовательности символов, ограниченных нулевым символом (‘\0’), сохраненная в расположенных последовательно байтах памяти. Иными словами – одномерный символьный массив представляет собой строку символов. В языке С++ существует два вида строк:

- массив символов (строка), завершающаяся нулевым байтом (null-terminated string), унаследованный от С и называемый строки в стиле С.

- строки типа string реализуются объектно-ориентированным подходом к программированию основанные на библиотечном классе string.

Строки первого вида имеют три варианта представления строки:

- массив char;

- константная строка в двоичных кавычках (называемая строковым литералом);

- указатель на char, содержащий адрес начало строки.

В трёх вариантах имя массива является указателем на char. При объявлении строки как массив символов, необходимо размер указать на единицу больше длины предполагаемой последовательности символов. Переменные типа массива символов обладают свойствами, как простой переменной, так и структурированной. Свойствами структурированного типа является обработка каждого элемента массива отдельно, а свойствами простого типа – весь массив обрабатывается целиком, как скалярная переменная. каждая отдельно взятая литера представлена некоторым числом, называемым кодом

Примеры объявления:

char SM = ‘A’; // переменная символьного типа SM инициализируется одной переменной, поэтому она заключена в одинарные кавычки;

char SM1[] = {‘F’,’I’,’L’,’E’,’S’}; //массив символов состоящий из 5 литеров, обладает свойствами массива но свойствами строки не обладает.

char SM2[] = {‘F’,’I’,’L’,’E’,’S’,’\0’}; //наличие нулевого символа придает свойства строки. Этот символ (‘\0’) представляет собой символ с ASCII-кодом 0, служит меткой конца строки.

char SM3[10] = “FILES”; //во время компиляции в ОП выделится 10 байтов памяти. На 0 месте расположится символ F, на первом – I, на 2 – L, на 3 – E, на 4 – S, а с 5 по 9 места автоматически присвоится нулевой символ. Эта строка называется строковой константой или строковым литералом. Строки в кавычках всегда неявно включают ограничивающий нулевой символ

char SM4[] = “FILES”; //под строковую константу SM4 в ОП выделится 6 байтов памяти, последним элементом автоматически установится нулевой байт.

Все имена SM1, SM2, SM3, SM4 имеют адрес элемента стоящего на нулевом месте, обращение к каждому элементу можно осуществлять по его порядковому номеру (SM1[i]). При вводе строковых переменных нулевой байт записывается в конец автоматически. Если же формирование строки происходит в программе, программист должен самостоятельно позаботиться о наличии нулевого байта. Строковая константа (с двойными кавычками) не взаимозаменяема с символьными константами (с одинарными кавычками).

char SM5 = ‘S’; //символьная константа ‘S’ – это сокращенное обозначение для кода символа 83 в системе ASCII, поэтому данный оператор присваивает значение 83 переменной SM5, но “S” представляет строку состоящую из двух символов – S и\0, и еще адрес ОП , по которому размещается строка. Поэтому оператор

char SM5 = “S”; //не соответствие типов.

Функции, которые работают со строками, руководствуются положением нулевого символа, а не размером массива. С++ не накладывает никаких ограничений на длину строки.