Вказівники в C АйТі бубон

Інструменти користувача

Інструменти сайту

Зміст

Вказівники у C++

Вказівники та масиви

У мові C існує сильний взаємозв'язок між покажчиками та масивами, настільки сильна, що покажчики та масиви дійсно слід розглядати одночасно. Будь-яку операцію, яку можна виконати за допомогою індексів масиву, можна зробити за допомогою покажчиків. Варіант із покажчиками зазвичай виявляється швидшим, але й дещо важчим для безпосереднього розуміння. Опис

визначає масив обсягу 10, тобто. набір із 10 послідовних об'єктів, званих a[0], a[1], …, a[9]. Запис a[i] відповідає елементу масиву через i позицій від початку. Якщо pa - покажчик цілого, описаний як

копіюватиме вміст a[0] в x.

Якщо ра вказує на певний елемент масиву a, то за визначенням pa+1 вказує на наступний елемент, і взагалі pa-i вказує на елемент, що стоїть на i позицій до елемента, що вказується pa, а pa+i на елемент, що стоїть на i позицій після. Отже, якщо pa вказує на a[0], то *(pa+1)

Ці зауваження справедливі незалежно від типу змінних у масиві a. Суть визначення "додавання 1 до покажчика", а також його поширення на всю арифметику покажчиків, полягає в тому, що збільшення масштабується розміром пам'яті, яку об'єкт займає, на який вказує покажчик. Таким чином, i pa+i перед додатком множиться на розмір об'єктів, на які вказує pa.

Очевидно, існує дуже тісна відповідність між індексацією та арифметикою покажчиків. Насправді компілятор перетворює посилання масив на покажчик початку масиву. Внаслідок цього ім'я масиву є вказівним виразом. Звідсивитікає кілька дуже корисних наслідків. Так як ім'я масиву є синонімом розташування його нульового елемента, то привласнення pa = a[0]

можна записати як pa=a.

Описи формальних параметрів у визначенні функції у вигляді char s [];

абсолютно еквівалентні; який вид опису слід віддати перевагу, визначається значною мірою тим, які вирази будуть використані при написанні функції. Якщо функції передається ім'я масиву, то залежно від того, що зручніше, можна вважати, що функція оперує або з масивом, або з покажчиком, і далі відповідним чином діяти. Можна навіть використовувати обидва види операцій, якщо це здається доречним та зрозумілим.

Наслідком такої інтерпретації імен масивів є те, що для того, щоб поставити покажчик на початок масиву, треба писати

Як описувати посилання (покажчики) на двовимірні масиви?

Як описувати посилання (покажчики) на двовимірні масиви? Розглянемо таку програму:

Вказівником тут є ptr. Зазначимо, що в нього задана розмірність другого вимірювання: Second, саме для того, щоб компілятор міг правильно обчислити двовимірні індекси.

Спробуйте самі оголосити

і побачити, до яких невеселих ефектів це призведе (компілятор, до речі, лаятиметься; але є ймовірність, що він все ж таки подорожує це для вас. Але працювати воно буде плачевно). Спробуйте також використати ptr[x][y].

Вказівники на функції

Наприклад, використовується у функції: Швидке сортування (англ. quicksort), часто зване qsort. У функції qsort покажчик на функцію застосовується для вказівки способу сортування.

Перш ніж вводити покажчик на функцію, нагадаємо, що кожна функція характеризується типом значення, що повертається, ім'ямта сигнатурою. Нагадаємо, що сигнатура визначається кількістю, порядком прямування та типами параметрів. Іноді кажуть, що сигнатурою функції називається список типів параметрів.

А тепер шляхом послідовності тверджень прийдемо до обговорення теми розділу уроку.

3. У визначенні нового покажчика повинен бути той же тип, що і значення, що повертається функцією, і та ж сигнатура.

4. Покажчик на функцію визначається так:

Наприклад: int (*func1Ptr) (char); - Визначення покажчика func1Ptr на функцію з параметром типу char, що повертає значення типу int.

Примітка: Будьте уважні. Якщо наведену синтаксичну конструкцію записати без перших круглих дужок, тобто. у вигляді int * fun (char); компілятор сприйме її як прототип певної функції з ім'ям fun і параметром типу char, що повертає значення покажчика типу int *. Другий приклад: char* (*func2Ptr) (char*, int); - Визначення покажчика func2Ptr на функцію з параметрами типу покажчик на char і типу int, що повертає значення типу покажчик на char.

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

Наступна програма відображає гнучкість механізму викликів функцій за допомогою покажчиків.

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

Масиви покажчиків на функції. Покажчики функції можуть бути об'єднані в масиви. Наприклад, float (*ptrArray[4]) (char); - Опис масиву з ім'ям ptrArray з чотирьох покажчиків на функції, кожна з яких має параметр типу char і повертає значення типу float. Щоб звернутися, наприклад, до третьої з цих функцій, потрібен такий оператор:

Як завжди, індексація масиву починається з 0, тому третій елемент масиву має індекс 2.

Пункти меню повторюються, доки не буде введено номер 5 -закриття.