Лабораторная работа: Вказівки, масиви і символьні рядки в мові C
Лабораторная работа: Вказівки, масиви і символьні рядки в мові C
Лабораторна робота
Вказівки, масиви і символьні рядки в мові C
програма вказівка масив символ
рядок
1. Мета роботи
Метою лабораторної роботи є отримання практичних навиків в роботі
з вказівниками і з адресною арифметикою в мові С.
2. Теоретичні відомості
В С++
існує надзвичайно потужний інструмент для роботи зі складними агрегатами даних,
який надає загальний підхід до різних на перший погляд програмних об’єктів
таких як масив та рядок. Цей і нструмент базується на широкому використанні
вказівника.
Вказівник
- це символічне представлення адреси. Він використовується для непрямої
адресації змінних і об'єктів.
В
мові С++ є операція визначення адреси — &, за допомогою якої визначається
адреса комірки пам’яті, що містить задану змінну. Наприклад, якщо vr — ім’я змінної,
то &vr —
адреса цієї змінної.
В С++
також існують і змінні типу вказівник. Значенням змінної типу вказівник є
адреса змінної або об'єкта. Нехай змінна типу вказівник має ім'я ptr, тоді в якості
значення їй можна присвоїти адресу за допомогою наступного оператора:
ptr=&vr;
В
мові С++ при роботі з вказівниками велике значення має операція непрямої
адресації — *. Операція * дозволяє
звертатися до змінної не напряму, а через вказівник, який містить адресу цієї
змінної. Ця операція є одномісною і має асоціативність зліва направо. Цю
операцію не слід плутати з бінарною операцією множення. Нехай ptr — вказівник,
тоді *ptr — це значення
змінної, на яку вказує ptr.
Опис
змінних типу вказівник здійснюється за допомогою операторів наступної форми:
<тип> *<ім'я вказівника на змінну заданого типу>;
Кожна
змінна в програмі це об'єкт, що має ім'я і значення по імені можна звернутися
до змінного й одержати її значення.
Оператор
присвоювання ( = ) виконує зворотну дію: імені змінної ставиться у
відповідність значення.
a=10;
Вираз
&a дозволяє одержати адресу ділянки пам'яті, виділеного змінній а. Операція
& застосовна тільки до об'єктів, що мають ім'я і розміщених у пам'яті.
Маючи
можливість визначити адреси змінної за допомогою &, треба мати можливість
працювати з цією адресою: зберігати його, передавати, перетворювати.
Для
цього вводиться поняття вказівника.
Вказівник
- це змінна, значенням якої служить адреса об'єкта конкретного типу. Нульова
адреса позначається константою NULL, що визначена в заголовному файлі stdio.h.
Щоб визначити вказівник треба повідомити на об'єкт якого типу посилається цей
вказівник.
char
*z;
int
*k,*i;
float
*f;
* -
це операція разіменування. Операндом цієї операції завжди є вказівник.
Результат операції - це той об'єкт, що адресує вказівник_операнд.
*z=’$ ‘;
*k=*i=0;
Приклад:
int
e, c, b, *m;
. . .
. . . . . .
m =
&e ;
*m =
c + b ;
Операції
над вказівниками.
присвоювання
(=);
одержання
значення об'єкта, на який посилається вказівник (*);
одержання
адреси самого вказівника (&).
Приклад:
int date = 10;
int
*i, *k;;
i =
&date;
k =
i;
z =
NULL;
Подібно
будь-яким змінної змінна типу вказівник має ім'я, арес у пам'яті і значення.
За
допомогою унарних операцій ++ і –і числові значення змінних типу вказівник
міняються по різному, у залежності від типу даних, з яким зв'язані ці змінні.
Приклад:
char
*z;
int
*k,*i;
float
*f;
. . .
. . . .
z++;
// значення змінюється на 1
і++;
// значення змінюється на 2
f++;
// значення змінюється на 4
Тобто
при зміні вказівника на 1, вказівник переходить до початку наступного
(попереднього) поля тієї довжини, що визначається типом об'єкта, який
адресується вказівником.
2.1 Використання
вказівників при роботі з масивами
Ім'я
масиву без індексу є вказівником-константою, тобто адресою першого елемента
масиву (a[0]).
a
*a = = a[0] ;
*(a+1) = = a[1];
. . . . . . . . .
*(a+і) = =a[і];
Відповідно
до синтаксису в С існують тільки одномірні масиви, але їх елементами , у свою
чергу, теж можуть бути масиви.
int
a[5][5];
Для
двовимірного масиву:
a[m][n]
= = *(a[m]+n) = = *(*(a+m)+n);
Приклад1.
Опис вказівників.
int
*ptri; //вказівник на змінну цілого типу
char
*ptrc; //вказівник на змінну символьного типу
float
*ptrf; //вказівник на змінну з плаваючою точкою
Такий
спосіб оголошення вказівників виник внаслідок того, що змінні різних типів
займають різну кількість комірок пам'яті. При цьому для деяких операцій з
вказівниками необхідно знати об'єм відведеної пам'яті. Операція * в деякому
розумінні є оберненою до операції &.
Вказівники
використовуються для роботи з масивами. розглянемо оголошення двовимірного масиву:
int
mas[4][2];
int
*ptr;
Тоді
вираз ptr=mas вказує на першу колонку першого рядка матриці. Записи mas і
&mаs[0][0] рівносильні. Вираз ptr+1 вказує на mas[0][1], далі йдуть
елементи: mas[1][0], mas[1][1], mas[2][0] і т. д.; ptr+5 вказує на mas[2][1].
Двовимірні
масиви розташовані в пам’яті так само, як і одновимірні масиви, займаючи
послідовні комірки пам’яті
ptr |
ptr+1 |
ptr+2 |
ptr+3 |
ptr+4 |
ptr+5 |
mas[0][0] |
mas[0][1] |
mas[1][0] |
mas[1][1] |
mas[2][0] |
mas[2][1] |
Розміщення
двовимірного масиву в пам’яті
Страницы: 1, 2 |