Покажчики c

Покажчики c

Збираючи інформацію для написання цієї статті, згадалося мені моє перше знайомство з покажчиками - смуток-печаль була ... Тому після прочитання кількох розділів по цій темі з різних книг про програмування на C ++, було вирішено піти іншим шляхом і викласти тему Покажчики C ++ в тій послідовності, в якій я вважаю за потрібне. Відразу дам вам коротке визначення і будемо розглядати покажчики в роботі - на прикладах. У наступній статті (Покажчики С ++. Частина 2) будуть викладені нюанси, застосування покажчиків з рядками в стилі Сі (символьними масивами) і основне, що слід запам'ятати.

Розглянувши такі приклади, ви зрозумієте головне - навіщо нам потрібні в програмуванні покажчики, як їх оголошувати і застосовувати.

Припустимо, в програмі нам необхідно створити цілочисельний масив, точний розмір якого нам не відомий до початку роботи програми. Тобто ми не знаємо скільки чисел знадобиться користувачеві внести в цей масив. Звичайно, ми можемо підстрахуватися і оголосити масив на кілька тисяч елементів (наприклад на 5 000). Цього (на нашу суб'єктивну думку) має вистачити користувачу для роботи. Так - дійсно - цього може бути достатньо. Але не будемо забувати, що цей масив займе в оперативній пам'яті багато місця (5 000 * 4 (тип int) = 20 000 байт). Ми то підстрахувалися, а користувач буде заповнювати тільки 10 елементів нашого масиву. Виходить, що реально 40 байт в роботі, а 19 960 байт марно займають пам'ять.

нерозумне використання оперативної пам'яті

У стандартну бібліотечну функцію sizeof () передаємо оголошений масив arrWithDigits рядок 10. Вона поверне на місце виклику розмір в байтах, який займає цей масив в пам'яті. На питання "Скільки чисел ви введете в масив?" Відповімо - 10. У рядку 15, вираз amount * sizeof (int) стане рівнозначним 10 * 4, так як функція sizeof (int) поверне 4 (розмір в байтах типу int). Далі введемо числа з клавіатури і програма покаже їх на екран. Виходить, що інші 4990 елементів будуть зберігати нулі. Так що немає сенсу їх показувати.

Покажчики c

Покажчики c
Тут нам підсвічує червоним оператор >> так як змінювати константне значення не можна.

Покажчики c
Тут нас попереджають про те, що розміром масиву НЕ може бути значення звичайної змінної. Необхідно константне значення!

У наступному коді ми будемо використовувати покажчик і нові для вас оператори new (виділяє пам'ять) і delete (звільняє пам'ять).

розумне використання оперативної пам'яті, застосовуючи покажчики

using namespace std;

setlocale (LC_ALL. "rus");

int sizeOfArray = 0; // розмір масиву (введе користувач)

cout <<"Чтобы создать массив чисел, введите его размер: " ;

cin >> sizeOfArray;

// на ділянку пам'яті, яку виділить new

int * arrWithDigits = new int [sizeOfArray];

for (int i = 0; i

Таким чином в рядку 16 був визначений динамічний масив. Це означає, що пам'ять під нього виділиться (або не виділиться) під час роботи програми, а не під час компіляції, як це відбувається зі звичайними масивами. Тобто виділення пам'яті залежить від розвитку програми і рішень, які приймаються безпосередньо в її роботі. У нашому випадку - залежить від того, що введе користувач в змінну sizeOfArray

У рядку 25 застосовується оператор delete. Він звільняє виділену оператором new пам'ять. Так як new виділив пам'ять під розміщення масиву, то і при її звільненні треба дати зрозуміти компілятору, що необхідно звільнити пам'ять масиву, а не тільки його нульовий осередки, на яку вказує arrWithDigits. Тому між delete і ім'ям покажчика ставляться квадратні дужки [] - delete [] arrWithDigits; Слід запам'ятати, що кожен раз, коли виділяється пам'ять за допомогою new. необхідно цю пам'ять звільнити використовуючи delete. Звичайно, по завершенні програми пам'ять, яку займає їй, буде автоматично звільнена. Але нехай для вас стане доброю звичкою використання операторів new і delete в парі. Адже в програмі можуть розташовуватися 5-6 масивів наприклад. І якщо ви будете звільняти пам'ять, кожен раз, коли вона вже не буде потрібно надалі в запущеній програмі - пам'ять буде витрачатися більш розумно.

Припустимо в нашій програмі ми заповнили масив десятьма значеннями. Далі порахували їх суму і записали в якусь змінну. І все - більше ми з цим масивом працювати вже не будемо. Програма ж продовжує роботу і в ній створюються нові динамічні масиви для якихось цілей. У цьому випадку доцільно звільнити пам'ять, яку займає перший масив. Тоді при виділенні пам'яті під інші масиви ця пам'ять може бути використана в програмі повторно.

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

спроба змінити змінні, передані в функцію

Покажчики c

Все вийшло - значення змінних були змінені в функції.

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

Параметри (аргументи) функцій:

Olej.

Дуже сумнівне твердження!
Масив оголошений локально (в функції) розміщується в стеку і очищається при завершенні функції. Особливо результативно це після дозволу масивів з динамічними межами стандартом C ++ 11.
А використання динамічно розміщуються масивів, при певних перевагах, має ще більше недоліків.

Парадокс.
Компілятор "compiler: GNU GCC Compiler" прийняв наступний код:

using namespace std;

int main ()
setlocale (LC_ALL, "Russian");

int SizeOfArray;
cout <<"Сколько чисел вы введёте в массив? " <> SizeOfArray;
int arrWithDigits [SizeOfArray] = <>;

for (int i = 0; i cout < arrWithDigits [i];
>
cout <

for (int i = 0; i cout <>
cout < return 0;
>

Програма, в якій працюю Code :: Block 16.01.
----- Build: Debug in Zadacha12 (compiler: GNU GCC Compiler) -----

mingw32-g ++. exe -Wall -g -c C: \ 2 \ codeblocks-16.01 \ Code \ Zadacha12 \ Zadacha12.cpp -o obj \ Debug \ Zadacha12.o
mingw32-g ++. exe -o bin \ Debug \ Zadacha12.exe obj \ Debug \ Zadacha12.o
Output file is bin \ Debug \ Zadacha12.exe with size 1,01 MB
Process terminated with status 0 (0 minute (s), 0 second (s))
0 error (s), 0 warning (s) (0 minute (s), 0 second (s))

Olej.

Парадокс то в чому?
Компілятор GCC набагато досконаліше компілятора від Microsoft, і набагато точніше в синтаксисі відповідає стандартам мови C ++.