- •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()
Void main()
{
int x[4], *pi = x, i; float y[4], *pf = y;
printf("\nномер елемента адреси елементів масивів:\n" "i pi+i x + 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. |
x+i |
&x[i] |
pf+i |
У+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]; х + і == &х[і].
Те саме значення можна представити у вигляді:
*(х + 0) == *х == х[0] - значення нульового елемента масиву х;
*(х + 2) == x[2] - значення другого елемента масиву х;
*(х + i) == x[i] - значення i-го елемента масиву х.
А операції над елементами масиву х можна представити у вигляді:
*х + 2== х[0] +2; *(х + і) - 3 == x[i] - 3;
6 Проблеми, пов'язані з вказівниками
Проблеми, пов'язані з вказівниками, виникають при некоректному використанні вказівників. Усі застереження щодо некоректного використання вказівників відносяться до мови Сі так само, як і до багатьох інших низькорівневих мов програмування. Некоректним використанням вказівників може бути:
• спроба працювати з неініціалізованим вказівником, тобто з вказівником, що не містить адреси ОП, що виділена змінній;
• втрата вказівника, тобто значення вказівника через присвоювання йому нового значення до звільнення ОП, яку він адресує;
• незвільнення ОП, що виділена за допомогою функції malloc();
• спроба повернути як результат роботи функції адресу локальної змінної класу auto (про функції та класи змінних йтиметься далі);
Запит на виділення ОП з купи робиться за допомогою функцій calloc() та malloc(). Повернення (звільнення) ОП робиться за допомогою функції free(). Розглянемо деякі проблеми, пов'язані з вказівниками.
При оголошенні вказівника на скалярне значення будь-якого типу оперативна пам'ять для значення, що адресується, не резервується. Виділяється тільки ОП для змінної-вказівника, але вказівник при цьому не має значення. Якщо вказівник має специфікатор static, то ініціюється початкове значення вказівника, рівне нулю (особливості статичних змінних, про що йтиметься в окремому розділі). Приклад ініціалізації вказівників нульовими значеннями при їх оголошенні:
static int *pi, *pj; /* pi = NULL; pj= NULL; */
Розглянемо приклад, що містить грубу помилку: спробу працювати з непроініціалізованим покажчиком.
