C++ Покажчики з прикладами

Що таке покажчики?

In C++, покажчик посилається на змінну, яка містить адресу іншої змінної. Як і звичайні змінні, покажчики мають тип даних. Наприклад, покажчик типу integer може містити адресу змінної типу integer. Покажчик символьного типу може містити адресу змінної символьного типу.

Ви повинні побачити покажчик як символічне представлення адреси пам'яті. За допомогою покажчиків програми можуть імітувати виклик за посиланням. Вони також можуть створювати динамічні структури даних і керувати ними. в C++, змінна-вказівник посилається на змінну, що вказує на певну адресу в пам’яті, на яку вказує інша змінна.

Адреси в C++

Зрозуміти C++ покажчики, ви повинні розуміти, як комп’ютери зберігають дані.

Коли ви створюєте змінну у своєму C++ програмі, їй призначається деякий простір у пам’яті комп’ютера. Значення цієї змінної зберігається у призначеному місці.

Щоб дізнатися місце в пам’яті комп’ютера, де зберігаються дані, C++ забезпечує & (довідковий) оператор. Оператор повертає адресу, яку займає змінна.

Наприклад, якщо x є змінною, &x повертає адресу змінної.

Синтаксис оголошення покажчика

Декларація C++ має такий синтаксис:

datatype *variable_name; 
  • Тип даних — це базовий тип покажчика, який має бути дійсним C++ тип даних.
  • variable_name має бути ім'ям змінної покажчика.
  • Зірочка, використана вище для оголошення покажчика, подібна до зірочки, яка використовується для виконання операції множення. Це зірочка, яка позначає змінну як покажчик.

Ось приклад правильного оголошення покажчика в C++:

int    *x;    // a pointer to integer
double *x;    // a pointer to double
float  *x;    // a pointer to float
char   *ch     // a pointer to a character

Оператор посилання (&) і оператор відхилення (*)

Оператор посилання (&) повертає адресу змінної.

Оператор розіменування (*) допомагає нам отримати значення, яке було збережене в адресі пам’яті.

Наприклад:

Якщо у нас є змінна з іменем num, яка зберігається за адресою 0x234 і зберігає значення 28.

Оператор посилання (&) поверне 0x234.

Оператор розіменування (*) поверне 5.

Приклад 1:

#include <iostream>
using namespace std;
int main() {
	int  x = 27;  
	int  *ip;        
	ip = &x;       
	cout << "Value of x is : ";
	cout << x << endl;
	cout << "Value of ip is : ";
	cout << ip<< endl;
	cout << "Value of *ip is : ";
	cout << *ip << endl;
	return 0;
}

вихід:

Оператор посилання (&) і оператор відхилення (*)

Як це працює:

Оператор посилання (&) і оператор відхилення (*)

Ось скріншот коду:

Оператор посилання (&) і оператор відхилення (*)

Пояснення коду:

  1. Імпортуйте файл заголовка iostream. Це дозволить нам використовувати функції, визначені у файлі заголовка, без помилок.
  2. Включіть простір імен std, щоб використовувати його класи без його виклику.
  3. Виклик функції main(). Логіку програми слід додати в тіло цієї функції. { позначає початок тіла функції.
  4. Оголошіть цілочисельну змінну x і присвойте їй значення 27.
  5. Оголошіть змінну покажчика *ip.
  6. Зберігайте адресу змінної x у змінній покажчика.
  7. Надрукуйте текст на консолі.
  8. Вивести на екран значення змінної x.
  9. Надрукуйте текст на консолі.
  10. Вивести адресу змінної x. Значення адреси зберігалося в змінній ip.
  11. Надрукуйте текст на консолі.
  12. Вивести значення, що зберігається за адресою вказівника.
  13. Програма має повернути значення після успішного виконання.
  14. Кінець тіла функції main().

Покажчики та масиви

Масиви та покажчики працюють на основі пов’язаної концепції. Під час роботи з масивами, які мають покажчики, слід звернути увагу на різні речі. Сама назва масиву вказує на базову адресу масиву. Це означає, що для призначення адреси масиву покажчику не слід використовувати амперсанд (&).

Наприклад:

p = arr;

Наведене вище є правильним, оскільки arr представляє адресу масиву. Ось інший приклад:

p = &arr;

Наведене вище невірно.

Ми можемо неявно перетворити масив на покажчик. Наприклад:

int arr [20];
int * ip;

Нижче наведено дійсну операцію:

ip = arr;

Після вказаної вище декларації ip і arr будуть еквівалентними, і вони матимуть спільні властивості. Однак для ip можна призначити іншу адресу, але ми не можемо нічого призначити arr.

Приклад 2:

У цьому прикладі показано, як обходити масив за допомогою вказівників:

#include <iostream>
using namespace std;
int main() {
	int *ip;
	int arr[] = { 10, 34, 13, 76, 5, 46 };
	ip = arr;
	for (int x = 0; x < 6; x++) {
		cout << *ip << endl;
		ip++;
	}
	return 0;
}

вихід:

Покажчики та масиви

Ось скріншот коду:

Покажчики та масиви

Пояснення коду:

  1. Оголошіть цілочисельну змінну-вказівник ip.
  2. Оголошіть масив з іменем arr і збережіть у ньому 6 цілих чисел.
  3. Призначити arr для ip. IP та arr стануть еквівалентними.
  4. Створіть цикл for. Змінна циклу x була створена для перебору елементів масиву від індексу 0 до 5.
  5. Вивести значення, що зберігаються за адресою IP покажчика. За кожну ітерацію повертатиметься одне значення, і загалом буде виконано 6 повторень. Endl - це a C++ ключове слово, що означає кінцевий рядок. Ця дія дозволяє переміщувати курсор на наступний рядок після друку кожного значення. Кожне значення буде надруковано в окремому рядку.
  6. Щоб перемістити вказівник до наступної позиції int після кожної ітерації.
  7. Кінець циклу for.
  8. Після успішного виконання програма повинна щось повернути.
  9. Кінець тіла функції main().

Покажчик NULL

Якщо немає точної адреси, яку потрібно призначити, то змінній покажчика можна призначити NULL. Зробити це потрібно під час декларування. Такий покажчик відомий як нульовий покажчик. Його значення дорівнює нулю і визначається в багатьох стандартних бібліотеках, таких як iostream.

Приклад 3:

#include <iostream>
using namespace std;
int main() {
	int  *ip = NULL;
	cout << "Value of ip is: " << ip;
	return 0;
}

вихід:

Покажчик NULL

Ось скріншот коду:

Покажчик NULL

Пояснення коду:

  1. Оголосити покажчик змінної ip і присвоїти їй значення NULL.
  2. Вивести значення змінної покажчика ip поряд із текстом на консолі.
  3. Після успішного завершення програма повинна повернути значення.
  4. Кінець тіла функції main().

Покажчики на змінні

З C++, ви можете маніпулювати даними безпосередньо з пам’яті комп’ютера.

Обсяг пам'яті можна призначати або перепризначати за бажанням. Це стало можливим завдяки змінним покажчика.

Змінні-покажчики вказують на певну адресу в пам'яті комп'ютера, на яку вказує інша змінна.

Його можна оголосити так:

int *p;

Або,

int* p;

У вашому прикладі ми оголосили змінну покажчика p.

Він буде містити адресу пам'яті.

Зірочка — це оператор розіменування, який означає вказівник на.

Покажчик p вказує на ціле значення в адресі пам'яті.

Приклад 4:

#include <iostream>

using namespace std;
int main() {
	int *p, x = 30;
	p = &x;
	cout << "Value of x is: " << *p;
	return 0;
}

вихід:

Покажчики на змінні

Ось скріншот коду:

Покажчики на змінні

Пояснення коду:

  1. Оголошіть змінну-вказівник p і змінну x зі значенням 30.
  2. Присвоїти адресу змінної x до p.
  3. Вивести значення змінної покажчика p поряд із текстом на консолі.
  4. Після успішного завершення програма повинна повернути значення.
  5. Кінець тіла функції main().

Застосування покажчиків

Функції в C++ може повертати лише одне значення. Крім того, усі змінні, оголошені у функції, розміщуються в стеку викликів функції. Як тільки функція повертається, усі змінні стека знищуються.

Аргументи функції передаються за значенням, і будь-яка модифікація змінних не змінює значення фактичних змінних, які передаються. Наступний приклад допомагає проілюструвати цю концепцію:

Приклад 5:

#include <iostream>

using namespace std;
void test(int*, int*);
int main() {
	int a = 5, b = 5;
	cout << "Before changing:" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;

	test(&a, &b);

	cout << "\nAfter changing" << endl;
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	return 0;
}

void test(int* n1, int* n2) {
	*n1 = 10;
	*n2 = 11;
}

вихід:

Застосування покажчиків

Ось скріншот коду:

Застосування покажчиків

Пояснення коду:

  1. Створіть прототип функції під назвою test, яка прийматиме два цілі параметри.
  2. Виклик функції main(). Ми додамо логіку програми в її тіло.
  3. Оголошіть дві цілі змінні a і b, кожна зі значенням 5.
  4. Надрукуйте текст на консолі. Endl (кінцевий рядок) перемістить курсор, щоб розпочати друк у наступному рядку.
  5. Виведіть значення змінної a на консолі поряд з іншим текстом. Endl (кінцевий рядок) перемістить курсор, щоб розпочати друк у наступному рядку.
  6. Виведіть значення змінної b на консолі поряд з іншим текстом. Endl (кінцевий рядок) перемістить курсор, щоб розпочати друк у наступному рядку.
  7. Створіть функцію з назвою test(), яка приймає адреси змінних a і b як параметри.
  8. Надрукуйте текст на консолі. \n створить новий порожній рядок перед друкуванням тексту. Endl (кінцевий рядок) перемістить курсор, щоб розпочати друк у наступному рядку після друку тексту.
  9. Виведіть значення змінної a на консолі поряд з іншим текстом. Endl (кінцевий рядок) перемістить курсор, щоб розпочати друк у наступному рядку.
  10. Виведіть значення змінної b на консолі поряд з іншим текстом. Endl (кінцевий рядок) перемістить курсор, щоб розпочати друк у наступному рядку.
  11. Після успішного завершення програма повинна повернути значення.
  12. Кінець тіла функції main().
  13. Визначення функції test(). Функція повинна приймати дві цілочисельні змінні-вказівники *n1 і *n2.
  14. Присвоєння змінній покажчика *n1 значення 10.
  15. Присвоєння змінній покажчика *n2 значення 11.
  16. Кінець тіла функції test().

Навіть незважаючи на те, що змінним a і b у тесті функції присвоюються нові значення, після завершення виклику функції це не відображається у зовнішній функції main.

Використання вказівників як аргументів функції допомагає передати фактичну адресу змінної у функцію, і всі зміни, внесені до змінної, будуть відображені у зовнішній функції.

У наведеному вище випадку функція 'test' має адресу змінних 'a' і 'b'. Ці дві змінні доступні безпосередньо з функції «test», тому будь-які зміни, внесені до цих змінних, відображаються у функції виклику «main».

Переваги використання покажчиків

Ось плюси/переваги використання покажчиків

  • Покажчики - це змінні, які зберігають адресу іншого змінні в C++.
  • Більш ніж одну змінну можна змінити та повернути функцією за допомогою покажчиків.
  • Пам'ять можна динамічно виділяти та звільняти за допомогою вказівників.
  • Покажчики допомагають спростити складність програми.
  • Швидкість виконання програми покращується за допомогою покажчиків.

Підсумки

  • Покажчик посилається на змінну, що містить адресу іншої змінної.
  • Кожен покажчик має дійсний тип даних.
  • Покажчик - це символічне представлення адреси пам'яті.
  • Покажчики дозволяють програмам імітувати виклик за посиланням і створювати динамічні структури даних і керувати ними.
  • Масиви і покажчики використовують пов’язану концепцію.
  • Ім'я масиву позначає основу масиву.
  • Якщо ви хочете призначити вказівнику адресу масиву, не використовуйте амперсанд (&).
  • Якщо немає конкретної адреси для призначення змінної покажчика, призначте їй NULL.