- •Покажчик – це змінна для адреси елементу пам'яті. Загальний формат оголошення покажчика має
- •Програма 1. Оголошує покажчик. Видає випадкову інформацію з області пам'яті, яка виділяється під
- •Перша область відводиться під покажчик. Ця область пам'яті має ім'я р. Друга область
- •Програма 2. Оголошує покажчик. Видає інформацію з областей пам'яті p і *p, які
- •Покажчику можна привласнити адресу однотипної змінної, яка оголошена в програмі. Наприклад, після виконання
- •У покажчик можна вводити інформацію з клавіатури, використовуючи директиву введення формату scanf() із
- •Схема пам'яті після оголошення змінних дана на мал. 2.
- •Програма 4. Оголошує покажчик. Для ініціалізації покажчика використовується директива new.
- •Розберемо роботу програми. Схема пам'яті після оголошення змінних дана на мал. 4.
- •Програма 5. Оголошує покажчик. Адреса в покажчик вводиться з клавіатури директивою scanf, в
- •Дана програма спочатку видасть адресу змінної x у форматі процесора. Потім в цьому
- •Покажчик на покажчик – це змінна для адреси покажчика.
- •Тут AY, A, N – випадкові числа у відповідних областях пам'яті. Області з
- •Програма 6. Оголошує покажчик на покажчик. Видає інформацію з областей пам'яті, які
- •Відмітимо, що якщо змінна p визначається, наприклад, кодом int **p, то при виконанні
- •Дана програма показує, що значення в змінній а і адреса першого елементу масиву
- •Програма 8. Програма демонструє способи доступу до елементів масиву через адреси, обчислює суму
- •Якщо задана матриця, наприклад а[n][m], то для неї визначений масив покажчиків а[n]. У
- •Програма 9. Демонструє, що при оголошенні двовимірного масиву, визначений масив покажчиків на перші
- •void main(void)
- •fclose(f1);
- •Під динамічною пам'яттю розуміється пам'ять, яка виділяється під час роботи програми. У мові
- •пам'яті під одновимірний масив.
- •Програма 12. Програма демонструє той факт, що при оголошенні покажчика в програмі можна
- •Програма 13. Для виділення динамічній пам'яті під матрицю
- •Програма 14. Виділяється динамічна пам'ять під матрицю з використанням масиву покажчиків.
Програма 8. Програма демонструє способи доступу до елементів масиву через адреси, обчислює суму елементів масиву.
const n = 5; void main()
{
int x[10], i, s = 0; // x – покажчик на перший елемент масиву.
int *rpt; // Визначуваний покажчик rpt і засилаємо туди значення rpt = x; // адреси 1-го елементу масиву. У x і rpt зберігається
//адреса 1-го елементу.
//Значення в змінній x змінювати не МОЖНА!!!
clrscr();
cout << "Введи елементи масиву: \n ";
for (; rpt - x < n; rpt++)// В циклі формуємо поточну адресу
// елемента масиву.
{i = rpt - x; // Якщо відоме значення покажчика, індекс елементу
//визначається формулою: i = rpt – x.
//rpt – поточне значення покажчика; x – адреса 1-го
//елементу.
cout << "x[" << i << "]= ";
scanf("%d", rpt); // Порівняєте з директивою scanf(%d”, &x[i]).
}
// Виведення масиву на екран. for (rpt = x; rpt - x < n; rpt++ )
cout << *rpt << " "; // Доступ до елементу через покажчик. for (i = 0; i < n; i++)
s = s + *(x + i); // Інша форма доступу до елементу масиву
// через покажчик. cout << "\n S= " << s << "\n";
getch(); }
Програма демонструє факт, що значення а, *(а + i) і *rpt (якщо код rpt+ + виконується i разів) визначають одну і ту ж область пам'яті.
Якщо задана матриця, наприклад а[n][m], то для неї визначений масив покажчиків а[n]. У i-м елементі масиву а[i] міститься адреса першого елементу i-го рядка. У змінній а міститься адреса першого елементу матриці, тобто справедлива тотожність &a[0][0] = а.
Програма 9. Демонструє, що при оголошенні двовимірного масиву, визначений масив покажчиків на перші елементи рядків матриці.
const n = 5, m =4;
void main() {int b[n][m], i;
clrscr();
for (i = 0; i < n; i++) // Перебираємо індекси рядків двовимірного
// масиву.
{ cout << " b(" << i << ")= " << b[i]; // Виведення значень елементів
// одновимірного масиву.
// Виведення адрес перших елементів рядків матриці. cout << " \n адреса b(" << i << ",0)= " << &b[i][0] << "\n\n";
} getch(); }
Дана програма демонструє той факт, що для змінної b[i] справедлива рівність b[i]= &b[i][0]. Зв'язок матриці з масивом покажчиків дозволяє
організувати доступ до елементів матриці через адреси. Для елементу матриці а[i][j] справедливі наступні формули:
•вираз а + i * m + j визначає адресу а, тобто &a[i][j] = a + i * m + j або а[i][j]= *(а + i * m + j). Тут i * m + j – порядковий номер елементу а[i][j];
•вираз а[i]+ j визначає адресу а, тобто &a[i][j] = а[i]+j або а[i][j]= *( а[i]+ j).
void main(void)
{ const n = 4, m = 4; FILE *f1;
int i,j *p, а[n][m]; clrscr();
// Введення двовимірного масиву з файлу. p = а[0];
f1 = fopen("t.dat", "r");
cout << "Доступ до елементів матриці відбувається по формулі: \n\n" << "\n *(а[i]+ j) \n\n";
for (i = 0; i <= n – 1; i++)
{ for (j = 0; j <= m – 1; j++, p++)
{ fscanf( f1, "%d", p ); |
// Одна з форм доступу до елементів |
|
// матриці через масив покажчиків. |
fclose(f1);
printf("\n"); p = а[0];
cout << "Доступ до елементів матриці відбувається по формулах: \n" << " *(а[i]+ j) \n *(p + i *m + j) \n\n";
f1 = fopen("t1.dat", "w");
for (i = 0; i <= n – 1; i++)
{for (j = 0; j <= m – 1; j++)
{printf(f1,"%d ", *(а[i]+ j ) ); // Одна з форм доступу до елементів // матриці через масив покажчиків.
printf(" %d\t", *(p + i * m + j )); // Одна з форм доступу до елементів
//матриці через масив покажчиків.
}
fprintf(f1,"\n"); printf("\n"); } fclose(f1); getch(); }
Під динамічною пам'яттю розуміється пам'ять, яка виділяється під час роботи програми. У мові С/С++ для виділення динамічній пам'яті використовуються покажчики.
Одновимірний масив. Для того, щоб задати пам'ять під одновимірний масив під час роботи програми, необхідно:
визначити покажчик, наприклад int *p;задати необхідний розмір n масиву;виконати код p = new int [n].
пам'яті під одновимірний масив.
void main()
{ int j,s; int *data;
cout << "Введи розмір масиву ";
cin >> s; |
// Введення розміру масиву. |
data = new int[s]; |
// Виділяється динамічна пам'ять для елементів |
// масиву розмірності s.
cout << “Після ініціалізації в змінній data значення адреси = ” << data << “\n”;
cout << "\nРазмер масиву = " << s
<< "\n\n Введи елементи масиву з клавіатури \n"; for (j = 0; j < s; j++)
{ cout << "data[" << j << "]= " ;
cin >> data [j]; // Доступ до елементів масиву через індекс.
}
cout << "\nВведен масив: \n"; for ( j = 0; j < s; j++)
cout << data[j] << “ “; // Виведення елементів масиву на екран. cout << "\n";
delete [] data; // Видаляє пам'ять, яка використовувалася для масиву. getch();