Базовий курс програмування на С++. Урок 14. Вказівники, посилання
У всякої дії є своя нагорода і своя ціна
Фільм “Мирний воїн”
Сьогодні ми вивчимо:
1. Розв’язок д/з минулого уроку
2. Адреса
3. Вказівники
4. Вказівники і масиви
5. Завдання для закріплення матеріалу
Розв’язок д/з минулого уроку
1. За допомогою рекурсії підрахувати добуток чисел у діапазоні введеного з клавіатури.
#include <iostream> #include <conio #include <algorithm> #include <vector> using namespace std; template <typename T> T Product (T i, T j, T res) { res*=i; i++; if (i<j)
return Product(i,j,res); if (i==j)
return res*i; } int main () { system("color A"); int b, e; cout<< "Enterstartnumber --> "; cin>> b; cout<< "Enterendnumber --> "; cin>> e; cout<< "Result: " <<Product(b,e,1); _getch(); return 0; }
2. Ханойська вежа
// Ханойська вежа #include <iostream> #include <algorithm> #include <vector> using namespace std; int counter = 0; void t(int r, int b, int e) { int c; if (((b == 1) && (e == 2)) || ((b == 2) && (e == 1))) c = 3; else if (((b == 1) && (e == 3)) || ((b == 3) && (e == 1))) c = 2; else if (((b == 2) && (e == 3)) || ((b == 3) && (e == 2))) c = 1; if (r>1) { t(r - 1, b, c); cout<< b << " --> " << e <<endl; counter++; t(r - 1, c, e); } else { cout<< b << " --> " << e <<endl; counter++; } } int main() { system("color A"); t(6, 1, 3); cout<< "\n" << "Counter = " << counter <<endl; system("pause"); return 0; }
Адреса
Давайте навчимося дізнаватися адресу пам’яті, де зберігається певна змінна, тобто ту клітинку пам’яті яка зберігає значення певної змінної. Для цього треба використовувати значок & перед іменем змінної. & можна використовувати лише для змінних та елементів масиву.
int main ()
{
int a = 5;
cout<< "a = " << a <<endl;
cout<< "&a = " <<&a <<endl;
_getch();
return 0;
}
Змінній a присвоєно значення 5.
&a – адреса змінної a.
Вказівники
Вказівник – змінна, яка зберігає адресу іншої змінної. Створюється вказівник за допомогою *.
Приклад програми:
#include <iostream>
#include <conio
#include <algorithm>
#include <vector>
using namespace std;
int main ()
{
int a = 5;
int *b = &a;
cout<< "a = " << a <<endl;
cout<< "&a = " <<&a <<endl;
cout<< "b = " << b <<endl;
cout<< "*b = " << *b <<endl;
cout<< "&b = " <<&b <<endl;
_getch();
return 0;
}
- Змінна a зберігає значення 5
- Вказівник b зберігає адресу змінної a
- Ми можемо дізнатися значення змінної a, використовуючи лише її адресу. Використовуємо символ * перед іменем вказівника, так ми звертаємося до цієї адреси і отримуємо значення, що там зберігається (dereference operator).
- b – адреса
- *b – дорівнює a- &b != &a
Вказівники і масиви
int a[10];
int *p = &a[0];
Так просто ми створили вказівник на перший елемент масиву. Ім’я масиву – вказівник на його перший елемент.
int *p = &a[0];
int *z = a;
Крім цього, нам достатньо тільки 1 вказівника, щоб працювати з цілим масивом.
#include <iostream>
#include <conio
#include <algorithm>
#include <vector>
using namespace std;
int main ()
{
int a[10];
for (int i=0; i<10; ++i)
a[i] = i;
int *p = a;
for (int i=0; i<10; i++, p++)
cout<< "*p = " << *p <<endl;
_getch();
return 0;
}
*(p+1) означає, що здійснюється посилання на наступний елемент.
Тепер згадайте функції і те як передаються масиви у функцію. Насправді, коли функції передається ім’я масиву, то вона отримує його початкове місце розташування і функція використовує його як змінну (вказівник). Це все можна записати так:
#include <iostream>
#include <conio
#include <algorithm>
#include <vector>
using namespace std;
void Show (int *p, int size)
{
for (int i=0; i<size; ++i, p++)
cout<< *p <<endl;
}
int main ()
{
int a[10];
for (int i=0; i<10; ++i)
a[i] = i;
Show(a, 10);
_getch();
return 0;
}
Завдання для закріплення матеріалу
1. Вам дано масив. Поміняйте місцями елементи з парними і непарними індексами.
2. Вам дано два масиви x[a], y[b]. Створіть третій масив, який буде вміщати:
- елементи обох попередніх масивів
- їх спільні елементи