Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LAB6_M~1.DOC
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
260.61 Кб
Скачать

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 ( );

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]