Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lek6_cpp_ukr.rtf
Скачиваний:
4
Добавлен:
18.11.2019
Размер:
340.33 Кб
Скачать

5. Операції над вказівниками

       Мова Сі надає можливості для виконання над вказівниками операцій присвоювання, цілочисельної арифметики та порівнянь. Мовою Сі можливо:

  1. присвоїти вказівнику значення адреси даних, або нуль;

2. збільшити (зменшити) значення вказівника;

3. додати або відняти від значення вказівника ціле число;

4. скласти або відняти значення одного вказівника від іншого;

5. порівняти два вказівники за допомогою операцій відношення.

       Змінній-вказівнику можна надати певне значення за допомогою одного із способів:

  1. присвоїти вказівнику адресу змінної, що має місце в ОП, або нуль, наприклад:

       pi = &j;

       pi = NULL;

  1. оголосити вказівник поза функцією (у тому числі поза main()) або у будь-якій функції, додавши до нього його інструкцію static; при цьому початковим значенням вказівника є нульова адреса (NULL);

  2. присвоїти вказівнику значення іншого вказівника, що до цього моменту вже має визначене значення; наприклад:

       pi = pj; це - подвійна вказівка однієї і тієї ж змінної;

  1. присвоїти змінній-вказівнику значення за допомогою функцій calloc() або malloc() - функцій динамічного виділення ОП.

       Усі названі дії над вказівниками будуть наведені у прикладах програм даного розділу. Розглянемо кілька простих прикладів дій над вказівниками.

       Зміну значень вказівника можна робити за допомогою операцій: +, ++, -, --. Бінарні операції (+ та -) можна виконувати над вказівниками, якщо обидва вказівники посилаються на змінні одного типу, тому що об'єм ОП для різних типів даних може вирізнятися.

       Наприклад, значення типу int займає 2 байти, а типу float - 4 байти. Додавання одиниці до вказівника додасть "квант пам'яті", тобто кількість байтів, що займає одне значення типу, що адресується. Для вказівника на елементи масиву це означає, що здійснюється перехід до адреси наступного елемента масиву, а не до наступного байта. Тобто значення вказівника при переході від елемента до елемента масиву цілих значень буде збільшуватися на 2, а типу float - на 4 байти. Результат обчислення вказівників визначений у мові Сі як значення типу int.

       Приклад програми зміни значення вказівника на 1 квант пам'яті за допомогою операції "++" і визначення результату обчислення вказівників даний на такому прикладі:

#include<stdio.h> void main () {      int a[] = { 100, 200, 300 };      int *ptr1, *ptr2;      ptr1=a; /*- ptrl одержує значення адреси а[0] */      ptr2 = &а[2]; /*- ptr2 одержує значення адреси а[2] */      ptr1++; /* збільшення значення ptrl на квант ОП:      ptr1 = &а[1]*/      ptr2++; /* збільшення значення ptr2 на квант ОП:      ptr2 = &а[3]*/      printf (" ptr2 - ptr1 = %d\n", ptr2 - ptr1); }

     Результат виконання програми:

ptr2 - ptr1 = 2

     Результат 2 виконання операції віднімання визначає 2 кванти ОП для значень типу int:

ptr2 - ptr1 = &а[3] - &а[1] = (а + 3) - (а + 1) = 2;

     У наступному Сі-фрагменті продемонстрований приклад програми для виведення значень номерів (індексів) елементів масивів, адрес першого байта ОП для їх розміщення та значень елементів масивів. Справа в тому, що в Сі є дуже важлива властивість - ім'я масиву еквівалентно адресу його нульового елемента: х == &х[0]. Вказівники pi і pf спочатку містять значення адрес нульових елементів масивів, а при виведенні складаються з i-номером елемента масиву, визначаючи адресу i-елемента масиву. Для одержання адрес елементів масивів у програмі використовується додавання вказівників-констант х та у, та змінних-вказівників pi і pf з цілим значенням змінної i. Зміна адрес у програмі дорівнює кванту ОП для даних відповідного типу: для цілих - 2 байти, для дійсних - 4 байти.

#include<stdio.h> void main() {      int x[4], *pi = х, i;      float y[4], *pf = y;      printf("\nномер елемента адреси елементів масивів:\n i pi+i х + i &x[i] pf+i у+i &y[i]\n");      for (i = 0; i < 4; i++ )           printf(" %d : %6u %6u %6u %6u %6u %6u\n", i, pi + i, x + i, &x[i], pf + i, y + i, &y[i]); }

     Результати виконання програми:

номер елемента адреси елементів масивів:

i

pi+i

х+i

&x[i]

pf+i

y+i

&y[i]

0:

65518

65518

65518

65498

65498

65498

1:

65520

65520

65520

65502

65502

65502

2:

65522

65522

65522

65506

65506

65506

3:

65524

65524

65524

65510

65510

65510

     Мовою Сі можна визначити адреси нульового елемента масиву х як х або &х[0]: х == &х[0]. Краще і стисло використовувати просто х - це базова адреса масиву. Ту саму адресу елемента масиву можна представити у вигляді: х + 2 == &х[2]; х + i == &x[i].

     Те саме значення можна представити у вигляді:

*(х + 0) == *х == х[0] - значення нульового елемента масиву х; *(х + 2) == x[2] - значення другого елемента масиву х; *(х + i) == x[i] - значення i-го елемента масиву х.      А операції над елементами масиву х можна представити у вигляді:

*х + 2== х[0] +2; *(х + i) - 3 == x[i] - 3;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]