Покажчики на рядки в c

Покажчики на рядки в c

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

Зараз ми розглянемо приклад де будемо передавати в функцію покажчики на рядки (покажчики типу char). При цьому сама функція повертає покажчик. Завдання наступна: Є два покажчика на рядки, під які виділені необхідні їм ділянки пам'яті. Необхідно об'єднати ці два рядки. Тобто треба виділити нову ділянку пам'яті для першого рядка, щоб стало можливим дописати в неї другий рядок.

виділення нового достатнього ділянки пам'яті для рядка

Йдемо по порядку. У рядку 4 знаходиться прототип функції. Її завдання - виділити нову ділянку пам'яті для рядка, в кінець якої запишеться інший рядок. Про це ми поговоримо нижче, коли дійдемо до визначення цієї функції. Переходимо до рядків 11 - 12. У них визначені змінні, які будуть зберігати значення довжини рядків "рядок 1" і "+ рядок 2". Довжина підраховується за допомогою вбудованої функції strlen (). Вона поверне значення довжини рядка без урахування символу \ 0. Тому при ініціалізації змінних strSize1 і strSize2 ми додаємо до того що поверне strlen (...) одиницю.

Покажчики на рядки в c
Звичайно - адже виділена ділянка пам'яті під перший рядок занадто малий, для того щоб дописати в нього ще які-небудь дані. У рядку 28 записуємо в змінну requiredSize реально необхідний розмір пам'яті для запису двох рядків: int requiredSize = (strSize1 + strSize2) - 1; Одиницю віднімаємо тому, що в змінних strSize1 і strSize2 вже включені два \ 0. а нам необхідний тільки один.

Створюємо новий покажчик і відразу виділяємо під нього пам'ять, достатню для розміщення символів обох рядків (стор. 44). Далі копіюємо в виділену пам'ять символи першого рядка: strcpy_s (strInFunc. ReqSize. Pstr1); Рядок скопійована - потрібно звільнити пам'ять, яку вона займала, щоб не сталося витоку пам'яті (стор. 48). Повертаємо з функції покажчик на нову ділянку пам'яті: return strInFunc;

Покажчики на рядки в c

Цей приклад показав, як ми, використовуючи покажчики, можемо розпоряджатися оперативною пам'яттю з точністю до байта.

Під кінець підведемо підсумки і позначимо основне, що необхідно запам'ятати про покажчики.

Навіщо потрібні покажчики в C ++?

Розглянемо докладно на прикладі:

У рядку 25 показаний приклад звернення до даних елементів масиву через покажчик. Використовується нотація масивів. Тобто нам не треба застосовувати операцію разименованія, щоб звернутися до даних масиву:

cout <<"pfirstArr[0] = " <

Можна, звичайно звертатися до даних масиву, використовуючи нотацію покажчиків, але це незручно. Подивіться, як би виглядало присвоєння значень елементів масиву і показ значень на екран:

Рядки 27 - 28 вихідного коду - визначення Сі-рядки і визначення покажчика на цей рядок. Покажчики чудово справляються з роботою з рядками. Коли ми в потоці cout звертаємося по імені до покажчика на символьний масив, він нам покаже всю рядок. Так само як і у випадку з масивами, компілятор буде виводити символи на екран, поки не виявить в масиві символ кінця рядка \ 0

Подивіться на підсумок роботи програми і на вихідний код ще раз. Постарайтеся зрозуміти як він працює.

Покажчики на рядки в c

Ще один відступ від теми, щоб підбадьорити тих, кому важко дається тема покажчиків :) Ви не одні. Все приходить з практикою! І до вас дійде! Не панікуйте, якщо це виглядає занадто заплутаним для вас. Вирішуйте як можна більше завдань з програмування. Навіть якщо ви щось будете робити не так в процесі написання коду, наші чудові середовища розробки дадуть про це знати.

Покажчики, як параметри (аргументи) функцій:

Не можу зрозуміти. в 15 рядку коду - strcpy_s (pStr1, strSize1, "рядок 1");
в функції strcpy_s використовується 3 аргументу, раніше при описі цієї функції в ній вказувалося тільки 2 аргументу (куди скопіювати і що скопіювати).
Власне питання. чому тепер в ній 3 аргументу? Тому що ми зараз використовуємо покажчик як перший аргумент? Чи тому що це нова версія цієї функції (strcpy_s замість strcpy)? Або цієї особливість visual studio? Оскільки в code. blocks функція strcpy приймає 2 аргументу <>.

У прикладі коду використана функція strcpy_s (), а не strcpy (), яка дійсно має 2 аргументу. Дивіться імена уважніше.

P.S. Це зовсім не означає, що так слід робити: strcpy_s () - функція, яка не входить до стандартів ні POSIX, ні C, ні Linux і т.д. і т.п. ... і використовується тільки в операційних системах Windows (ви не знайдете навіть її опису в літературі). Але конкретний цей приклад - коректний.

Зрозумів тільки те що опису strcpy_s я не знайду, а чому цієї функції потрібно знати розмір рядка не зрозуміло.
Розмір рядка їй треба знати тому що першим аргументом покажчик? Або це особливість оновленої функції? І скільки аргументів ця функція взагалі приймає (може приймати)?

Вказувати розмір копируемой рядки дуже корисно: якщо рядок джерело, завдяки випадку, довше приймача, то ви отримаєте помилку доступу до пам'яті з крахом всього програми.

Подивіться опис бібліотечної та стандартної функції strncpy (), яка безпечніше і частіше застосовується в професійному коді ніж strcpy ().

Схожі статті