Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вказівники та посилання.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
857.42 Кб
Скачать

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; */

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