Вказівник як аргумент функції
Ми вже розглядали як створювати функції та як передавати у них аргументи.
Варто зауважити, що коли ми передаємо у функцію звичайний аргумент, то програма створює його копію та використовує її у функції. Це гарантує, що початкове значення залишиться не змінним. Бувають ситуації, що вам потрібно змінити початкові значення, то тоді можна використовувати передачу аргументу за допомогою вказівника.
Для цього в якості аргумента функції ми маємо створити вказівник.
Пам’ятаємо, вказівники створюються так:
Тип_вказівника * ім’я_вказівника;
Тип вказівника має бути таким же як і тип змінної на яку він вказуватиме.
Доволі часто функції які використовують вказівники не повертають жодного значення, тому використовують тип Якщо ж функція має повернути якесь значення, то не забувайте вказувати тип функції (тип значення яке має повернути дана функція).
Коли передаєте в аргументи в дану функцію (яка приймає аргументи як вказівники), то перед іменем змінної потрібно поставити символ Адже, вказівник приймає значення у вигляді адресу пам’яті на якусь змінну.
Розглянемо дану програму:
#include <iostream>
//створюємо функцію в якості аргументу якої
//є вказівник «int *a»
void fun(int *a)
{
std::cout << "input number: ";
//пам’ятайте, щоб використати значення вказівника потрібно
//перед іменем вказівника поставити символ «*»
//змінна «а» є вказівником. Тому змінюючи її ми на справді
//змінюємо значення по адресі (змінній) на яку він вказує
std::cin >> *a;
}
int main()
{
int c = 8;
std::cout << "c = " << c << std::endl;
//коли ми передаємо аргумент у функцію, то потрібно передати
//її (змінної) адресу.
//тому потрібно поставити перед іменем змінної символ «&»
fun(&c);
//зверніть увагу. Ми змінили значення змінної «с» через
//вказівник у функції
std::cout << "c = " << c << std::endl;
return 0;
}
Звісно, ви можете передавати декілька значень (аргументів) у функцію за допомогою вказівників. Але не створюйте такі змінні зі значенням за замовчуванням! Це вважатиметься помилкою.
Ви можете комбінувати аргументи функцій. Частина з них може бути вказівниками, а частина звичайними змінними.
Наприклад:
void fun(int *a, float *b, int c, int b)
Як було вказано раніше при передачі змінної у функцію в якості звичайного аргументу програма створює копію даної змінної та використовує її у функції. При передачі складних змінних (структур, класів які вчитимемо пізніше) або великої кількості даних (масивів) на копіювання потрібен час та ресурси. Тому, програма може бути не на стільки ефективною. Часто щоб пришвидшити роботу програм використовують вказівники. Але я ми вже знаємо вони працюють на пряму зі значенням і можна випадково його змінити. Якщо це не потрібно, то варто передавати значення через константний вказівник (додавати слово Це гарантуватиме, що значення не будуть змінені.
Наприклад:
void fun(const int *a)
Ми зможемо використовувати значення яке передаємо і гарантуємо, що воно не зміниться під час виконання програми. При цьому змінна яку передаємо може бути не константною.
#include <iostream>
void fun(const int *a)
{
//ми можемо використовувати значення
//яке передаємо у функцію
std::cout << *a * 10 << std::endl;
//але не можемо його змінювати
//бо воно є константним
//*a += 10; //помилка
}
int main()
{
int c = 3;
fun(&c);
std::cout << c;
return 0;
}