Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемЕлена Желябужская
1 Вказівники і масиви в мові С++
2 План. 1.Загальні відомості про вказівники. 2.Операції над вказівниками. 3.Вказівники і масиви. 4.Масив як параметр функції.
3 Загальні відомості про вказівники. Вказівник це адреса поля памяті, займаного програмним об'єктом. Наприклад: int a=5; char с='G'; float r=1.2E8; Ці величини розмістилися в пам'яті комп'ютера таким чином:
4 Операція & адреса. Застосування цієї операції до імені змінної дає в результаті її адресу в пам'яті. Для змінних з даного вище прикладу: &а рівне FFC0 &с - FFC2 &r - FFC3. Опис вказівників. Для зберігання адрес використовуються змінні типу «вказівник». Формат опису таких змінних наступний: тип *імя_змінної
5 Приклади опису вказівників: int *pti; //змінна pti може приймати значення вказівника на //величину цілого типу char *ptc; // змінна ptc призначена для зберігання вказівника //на величину типу char float *ptf ; //змінна ptf на величину типу float. Вказівникам можуть привласнюватися значення адрес об'єктів тільки того типу, з яким вони описані. У нашому прикладі допустимі оператори pti=&a; ptc=&c; ptf=&r; В результаті вказівники приймуть наступні значення: pti - FFC0, ptc - FFC2, ptf - FFC3
6 Значення вказівників можуть ініціалізуватися при описі. Наприклад: int a=5; int *pti=&a; char c='G'; char *ptc=&c; float r=1.2E8; float *ptf=&r; У заголовному файлі stdio.h визначена константа нульовий вказівник з ім'ям NULL. Її значення можна привласнювати вказівнику. Наприклад: ptf=NULL; Не треба думати, що після цього покажчик ptf буде зсилатися на нульовий байт пам'яті. Нульовий вказівник означає відсутність конкретної адреси зсилки.
7 Використаний в описах вказівників символ * (зірочка) у даному контексті є знаком операції розадресації. З її допомогою можна зіслатися через вказівник на відповідну змінну. Після приведених вище описів в записі виразів цієї програми взаємозамінними стають a і *pti, c і *ptc, r і *ptf. Наприклад, два оператори x=a+2; і x=*pti+2; тотожні один одному. В результаті виконання оператора cout<<*pti<
8 Операції над вказівниками. Записуючи вирази і оператори, що змінюють значення вказівників, необхідно пам'ятати головне правило: одиницею зміни значення вказівника є розмір відповідного йому типу. Наприклад: pti=pti+1; або pti++;// змінить значення вказівника pti на 2, //прийме значення FFC2. pti--; //значення вказівника зменшиться на 2 і стане //рівним FFBE. ptc++; // збільшить значення вказівника на 1; ptf++; // збільшить значення вказівника на 4.
9 Вказівники і масиви. Ім'я масиву трактується як вказівник-константа на масив. Наприклад: int x[10]; х є покажчиком на нульовий елемент масиву в пам'яті комп'ютера. У зв'язку з цим істинним є відношення x==&x[0] Звідси витікає, що для доступу до елементів масиву окрім індексованих імен можна використовувати розадресовані вказівники за принципом: ім'я[індекс] тотожне *(ім'я+індекс) Наприклад, для описаного вище масиву х взаємозамінні наступні позначення елементів: x[5], або *(x+5), або *(5+x)
10 Тепер розглянемо двовимірні масиви. Наприклад: int p[5][10]; // матриця з п'яти рядків і десяти чисел в //кожному рядку р є покажчиком-константою на масив, тобто на елемент p[0][0]. Індексоване ім'я p[і] позначає i-й рядок. Йому тотожньо наступне позначення у формі розадресованного вказівника: *(p+і*10) Звернення до елементу масиву р[2][4] можна замінити на *(p+2*10+4). У загальному випадку еквівалентні позначення: p[i][j] і *(p+i*10+j) Тут двічі працює операція «квадратна дужка». Останній вираз можна записати інакше, без явної вказівки на довжину рядка матриці р: *(*(p+i)+j)
11
Масив як параметр функції. Приклад Дана дійсна матриця А[М][N]. Потрібно обчислити і вивести евклідові норми рядків цієї матриці. Нормою Евкліда вектора називають корінь квадратний з суми квадратів його елементів. Якщо рядок матриці розглядати як вектор, то дану формулу треба застосувати до кожного рядка. В результаті отримаємо M чисел. Визначення функції обчислення норми довільного вектора: double Norma(int n, double x[]) { int i; double s=0; for(i=0;i
12 Розглянемо фрагмент основної програми, що використовує дану функцію для обробки матриці розміром 5x10. void main() { double A[5][10]; int і; //Введення матриці //обчислення і виведення норми рядків for(i=0; i<5; i++) cout<<"Hopмa"<
13
Приклад Заповнити двовимірну матрицю випадковими цілими числами в діапазоні від 0 до 99. Відсортувати рядки отриманої матриці по зростанню значень. Відсортовану матрицю вивести на екран. #include const n=5;//Глобальное объявление константы //Прототипы функций void Matr(int M[] [n]) ; void Sort(int, int X[]); //Основная программа void main(){ int i,j, A[n][n] ; clrscr(); cout<<"\n"<<"Maтрица до сортировки: "<<"\n"; Matr(A); for(i=0;i
14
// Функция сортировки вектора void Sort(int k, int X[]) { int i,j, Y; for(i=0; i
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.