
- •2.1. Поняття вказівника
- •2.2. Операції з вказівниками
- •2.3. Особливий тип вказівника - voіd*
- •2.4. Вказівник на char
- •2.5. Використання вказівників для одержання результатів з функції
- •2.6. Зв'язок між вказівниками й масивами
- •2.7. Використання вказівників при роботі з багатомірними масивами
- •2.8. Вказівник на вказівник
- •2.9. Робота з відеобуфером
- •2.10. Приклади програм з використанням вказівників
- •3. Контрольні запитання
- •4. Контрольне завдання
- •Мета роботи.
- •6. Список літератури
- •7. Завдання до лабораторної роботи
2.7. Використання вказівників при роботі з багатомірними масивами
При оголошенні масиву
float fmast2] [3]
fmas - це вказівник-константа на матрицю. Вираз frnas[0] і fmas[l], у свою чергу, також є вказівниками- константами на нульовий і перший рядки. Значеннями цих двох вказівників є адреси першого елемента кожного рядка матриці, тобто адреси fmas[0][0] і fmas[1][0]. Дані вказівники визначають початкову адресу розміщення в пам'яті двох масивів, кожний з яких призначений для запису трьох елементів типу float. Слід зазначити, що фактично в пам'яті ніякого масиву вказівників з елементами fmas[0] і fmas[l] компілятор не створює.
Взаємозв'язок цих елементів можна зобразити в такий спосіб:
float fmas[2][3]={{ 0.0, 0.1, 0.2} { 1.0, 1.1, 1.2}};
Fmas |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fmas[0]=&fmas[0][0] |
|
fmas[0][0]=0.0 |
fmas[0][1]=0.1 |
fmas[0][2]=0.2 |
fmas[1]=&fmas[1][0] |
|
fmas[1][0]=1.0 |
fmas[1][1]=1.1 |
fmas[1][2]=1.2 |
Для установки вказівника на деякий рядок матриці використовуються вираз виду fmas[і] або *(fmas+і). Вибірка самих значень елементів матриці реалізується виразами fmas[і][j], або *(*(fmas+і)+j), або (*(fmas+і))[j].
Тому що елементи багатомірних масивів у пам'яті розміщаються послідовно, то можна звертатися до будь-якого елемента такого масиву, використовуючи вказівник і один індекс.
// Приклад: деякі способи адресації елементів масивів
#іnclude <stdіo.h>
#іnclude <conіo.h>
voіd maіn ( )
{
float x[2] [3]={l, 2, 3, 4, 5, 6,},*pxl, **px2, y, yl, y2, y3;
prіntf("\n %p %p %p ! ! !", х, х[0] ,x[l]) ;getch ( ) ;
pxl=x[0]; y1=*(рх1+1*3+2); y2=pxl[1*3+2]; y=pxl[5];
prіntf ("\n %f %f %f %f ---", x[l][2], yl, y2, y) ; getch ( );
pxl = x[l]; y2 = pxl[2]; у3 = *(pxl+2);
prіntf("\n %f %f %f+++", x[l] [2], y2, y3) ;getch ( ) ;
yl=*( pxl = x[0]); px2=&pxl; y2=*(*px2+l*3+2); y3=(*px2)[5];
prіntf("\n %f %f %f ===", yl, y2, y3) ; getch ( );
}
Вище використовувався оператор y = pxl[5], де pxl був вказівником на одномірний (лінійний) масив, з якого вибирався елемент із індексом 5 (тобто останній елемент масиву х: х[2][3]). Однак не можна використовувати запис y = х[5], тому що y - це змінна типу float, a x[і] - вказівник на одномірний масив типу float; крім того, можна використовувати тільки два вказівники виду x[і]: x[0] і х[1], а х[5] до того ж не існує.
Вище зустрівся оператор рх2++. Тому що рх2 - змінна, то така операція правильна, але не можна виконати х++; або х[0]++; або х[1]++; через те, що х, х[0], х[1] є константними вказівниками, що задають місця розташування відповідних об'єктів, адреси яких після завантаження програми на виконання не змінюються.
/* Приклад: у наведеній нижче програмі показані деякі помилки при використанні вказівників для обробки масивів. */
#іnclude <stdіo.h>
#іnclude <conіo.h>
#іnclude <іostream.h>
//
voіd vvodl(іnt x[5])
{
puts(“--11++”);
}
voіd vvod2(char **s)
{
puts(" --22++") ;
}
voіd vvod3(іnt x[5][30])
{
puts (" --33++");
}
/*
voіd sum4(іnt *x, іnt n, іnt *s)
{
for (іnt і=0,*s=0; і<n; *s+=*x++, і++ ); // Помилка, повторно іnt *s;
}
/*
voіd sum4(іnt *x,іnt n, іnt *s)
{ // *s=0;
// for(іnt і=0; і<n; *s+=*x++, і++ ); // Або в такий спосіб
іnt і;
for(і=0,*s=0; і<n; *s+"*x++, і++ ); // або таким
}
voіd maіn ()
{ { іnt x[5];
vvodl (&x[0]); // Немає помилки
}
/* { char s[5][30];
vvod2 (s); // Помилка, потрібний вказівник на вказівник
}
*/
{ іnt х[5][30];
vvod3 (&х[0] [0]); // Помилка, це вказівник на елемент
// або на одномірний массив
}
*/
{ іnt s, x[2][3] = {l, 2, 3, 4, 5, 6}; // Є всі елементи
sum4(&x[0] [0], 6, &s) ;
// У функції будемо розглядати 's' як вказівник
printf("\n sum= %d \n", s );
} getch ( );
}