- •1 Основні відомості про вказівники
- •2. Вказівники та посилання
- •Void function_a (char*, int, short*);
- •Int *pi; /* вказівник-змінна на дані типу int */
- •3. Ініціалізація вказівника
- •4. Розіменування та присвоєння
- •5. Void-вказівник
- •6. Операція пересування вказівника
- •7. Використання вказівників з модифікатором const
- •8. Деактивації дії модифікатора
- •9. Подвійний вказівник
- •10. Вказівники і масиви
- •11. Доступ до ділянок динамічної пам'яті
- •12. Звільнення пам'яті
- •8. Операції з вказівниками
- •Int I, *pi; /* pi –змінна-вказівник */
- •13. Динамічні масиви
- •11. Посилання
- •Лабораторный практикум
- •Вопросы без ответов
- •3 Основні операції над вказівниками
- •4 Багаторівнева непряма адресація
- •5 Операції над вказівниками
- •Void main ()
- •Void main()
- •6 Проблеми, пов'язані з вказівниками
- •Int *х; /* змінній-покажчику 'х' виділена оп, але 'х' не містить значення адреси оп для змінної */
- •Int *х; /* х - ім'я покажчика, він одержав оп*/
- •Void main ()
- •9 Масиви
- •1.9.1 Основні поняття
- •Int а[5]; /* оголошення зовнішнього масиву */ main ()
- •9.2 Оголошення та звертання в одновимірних масивах
- •9.3 Оголошення та звертання до багатовимірних масивів
- •Int а[3][4]; /* а - вказівник-константа */
- •10 Масиви покажчиків
- •10.1 Робота з великими масивами
- •Void main()
- •Int *p[200], I, j; clrscr() ;
- •10.2 Вільні масиви та покажчики
- •11 Символьні рядки
- •11.1 Основні відомості про представлення рядків
- •11.2 Функції роботи з рядками
- •1. Функції введення рядків.
- •2. Функції виведення рядків.
- •14 Лекція №14
- •14.1 Вказівники Лекція № 2 - Вказівники та посилання
- •1.2.1. Вказівники
- •6. Вказівники і масиви
- •6.1. Вказівники і адреси
- •6.2. Вказівники і аргументи функцій
- •6.3. Вказівники і масиви
- •6.4. Адресна арифметика
- •6.5. Вказівники символів і функції
- •6.6. Вказівники – не цілі значення
- •6.7. Багатовимірні масиви
- •6.8. Масиви вказівників (вказівники на вказівники)
- •6.9. Ініціалізація масивів вказівників
- •6.10. Вказівники і багатовимірні масиви
- •6.11. Командний рядок аргументів
- •6.12. Вказівники на функції
- •Посібник для початківця про вказівники
- •6. Вказівники і структуровані програмні змінні
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •9. Вказівники типу far
- •10. Вказівники і динамічні змінні (керування пам'яттю)
- •8. Вказівники і динамічні змінні (керування пам'яттю)
- •Void* operator new(size_t t)
- •Void operator delete(void* p)
- •Void main()
5 Операції над вказівниками
Мова Сі надає можливості для виконання над вказівниками операцій присвоювання, цілочисельної арифметики та порівнянь. Мовою Сі можливо:
1. присвоїти вказівнику значення адреси даних, або нуль;
2. збільшити (зменшити) значення вказівника;
3. додати або відняти від значення вказівника ціле число;
4. скласти або відняти значення одного вказівника від іншого;
5. порівняти два вказівники за допомогою операцій відношення.
Змінній-вказівнику можна надати певне значення за допомогою одного із способів:
1. присвоїти вказівнику адресу змінної, що має місце в ОП, або нуль, наприклад:
pi = &j; pi = NULL;
2. оголосити вказівник поза функцією (у тому числі поза main()) або у будь-якій функції, додавши до нього його інструкцію static; при цьому початковим значенням вказівника є нульова адреса (null);
3. присвоїти вказівнику значення іншого вказівника, що до цього моменту вже має визначене значення; наприклад: pi = pj; це - подвійна вказівка однієї і тієї ж змінної;
4. присвоїти змінній-вказівнику значення за допомогою функцій 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 одержує значення адреси a[0] */
ptr2 = &a[2]; /*- ptr2 одержує значення адреси a[2] */
ptr1++; /* збільшення значення ptrl на квант ОП: */
ptrl = &а[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>
