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

Int *pmas;

pmas = mas;

cout << "Введіть 6 елементів масиву" << endl;

for ( i = 0; i < 6; i++) cin >>*pmas++;

// Наступний оператор знову встановлює покажчик на початок масиву

// (інакше він буде вказувати на наступну за масивом адресу)

pmas = mas;

for ( i =1; i < 6; i++)

{

stc = *(pmas + i);

j = i - 1;

while ( j >= 0 && stc > *(pmas+j))

{

*(pmas+j+1) = *(pmas+j);

j - - ;

}

*(pmas+j+1) = stc;

}

cout << "Результат" << endl;

for ( i = 0; i < 6; i++)

cout << i << " елемент " << *(pmas + i ) << endl;

// Можна використовувати і таку конструкцію оператора

// cout << i << " елемент " << * pmas++ << endl;

getch ( ); // Для затримки екрана виведення результату

return 0;

}

2.5 Масиви покажчиків

Як і інші змінні, покажчики можна групувати в масиви, кожен елемент якого містить адресу рядка масиву даних у пам'яті. У такий спосіб можна зберігати дані з "рваними" краями. Цей масив схожий на двовимірну таблицю з одним виключенням: усі рядки в такому масиві можуть мати різну довжину. При збереженні рядків це дозволяє заощаджувати пам'ять, а при виконанні сортування рядків, вона виконується значно швидше, тому що змінюються тільки покажчики, а не вміст рядків.

fio

(0)

->

П

Е

Т

Р

ПРО

У

\0

(1)

->

І

У

А

Н

ПРО

У

\0

(2)

->

ДО

У

Ц

\0

(3)

->

У

А

Р

І

Ч

\0

(4)

->

Ю

Ш

ДО

ПРО

\0

(5)

->

П

Л

Ю

Щ

\0

Приведемо програму реалізуючу виведення подібної інформації з використанням масиву покажчиків.

// P2_11.CPP

#include <iostream.h>

main ( )

{

char *fio [ ] = { "Петров",

"Іванов" ,

"Куций",

"Варич",

"Юшко",

"Плющ " };

int str;

for ( str = 0; str <= 5; str++)

cout << " stroka " <<( str +1 ) << ” = ” << *( fio+str ) << endl;

return 0;

}

Особливістю масиву покажчиків є те, що кожен з цих покажчиків елементів масиву може вказувати на масив довільної довжини. Так двовимірний масив чисел можна записати як матрицю, і як одновимірний масив покажчиків, наприклад: int matr[5][7]; чи int *pmt [5]; .

При цьому двовимірний масив розглядається як одновимірний масив рядків, кожен елемент якого — це теж масив стовпців, тобто масив масивів, тому індексування елементів матриці записується у вигляді mas [i][j].

Якщо двовимірний масив описаний за допомогою масиву покажчиків, то доступ до mas [i][j] елемента може здійснюватися одним зі способів:

* ( pm[i]+j ) або *( *( pm+i )+j ) .

Приклад 2.6 До елементів матриці, що має парні значення, додати число і вивести отриману матрицю в природному вигляді.

Перший варіант програмної реалізації матриця описується явним способом і робота ведеться з її елементами.

// P2_12.CPP — робота ведеться без покажчиків.

#include < iostream.h >

main( )

{

int mat [2][3];

int і, j;

cout << " Введіть матрицю "<< endl;

for ( i = 0; i < 2; i++)

for ( j = 0; j < 3; j++)

cin >> mat [i] [j] ;

// Обробка і виведення матриці

cout << " Матриця mat " << endl;

for ( i = 0; i < 2; i++)

{

for ( j = 0; j< 3; j++)

{

if ( ( mat [i][j] /2 )*2 == mat[i][j])

mat[i][j] = mat[i][j] + 5;

cout << mat [i][j] << " ";

}

cout << endl; // Переведення рядка при виведенні матриці

}

}

Другий варіант програмної реалізації матриця описана як масив покажчиків.

//P2_13.CPP — матриця описана як масив покажчиків:

#include < iostream.h >

main ( )

{

int і, j, *pm[2];

cout << "Введіть матрицю "<< endl;

for ( i = 0; i < 2; i++)

for ( j = 0; j < 3; j++)

cin >> *( pm[i] + j );

cout << " Матриця МАТ "<< endl;

for ( i = 0; i < 2; i++)

{

for ( j = 0; j < 3; j++)

{

if ( *(pm[i] + j) / 2*2 == *( pm[i] + j ) )

*( pm [i] + j ) += 10;

cout << *( pm [i] + j) << " ";

}

cout << endl;

}

return 0;

}

У розглянутій програмі для виведення матриці можна використовувати інший вигляд оператора :

сout << ( (j == 0) ? '\t':' ') << *( pm[i]+j ) << ( (j == 2) ? '\n':' ') ;

Ім'я двовимірної матриці є покажчиком-константою на масив покажчиків-констант, кожний з якиХ указує на початок відповідної рядка матриці, наприклад для матриці mat [2] [2] маємо :

mat [0] — покажчик-константа на нульовий рядок матриці;

mat [1] — покажчик-константа на перший рядок матриці;

mat [2] — покажчик-константа на другий рядок матриці;

тобто: mat[0] == &mat[0][0];

mat[1] == &mat[1][0];

mat[2] == &mat[2][0];

Виведення матриці можна реалізувати в такий спосіб:

cout << mat [i] [j];

cout << *( mat [i] +j );

cout << *(* (mat +i )+j );

У С++ можна описати змінну, що має тип "покажчик на покажчик". Ознакою такого типу є повторення символу "*" при описі змінної, наприклад int ** pmt; при цьому пам'ять для такої змінної не виділяється. Її треба привести до відповідного масиву. При описі покажчик на покажчик можна ініціалізувати, наприклад :

int x = 20;

int *px1 = &x;

int** px2 = &px1;

int ***px3 = &px2;

Доступ до змінної x тепер можна здійснити одним із трьох способів: *px1; **px2; ***px3; .

Для доступу до пам'яті через покажчики на покажчики можна використовувати як індекси так і символи "*", наприклад, еквівалентними будуть посилання на змінну x:

px1 [0] *px1;

px2 [0][0] **px2;

px3 [0][0][0] ***px3;