Ця стаття потребує додаткових для поліпшення її . (грудень 2018) |
Вказівни́к, пока́жчик або пока́зник, іноді також посилання (англ. pointer або reference) — тип даних у комп'ютерних мовах програмування, об'єкт програми, що містить адресу в пам'яті комп'ютера іншого об'єкта.
Вказівники разом з операцією їх розіменування (англ. dereference operator) були винайдені Катериною Логвинівною Ющенко в 1955 р. в адресній мові програмування. За термінологією Ющенко розіменування вказівника називалося «штрих-операцією». Закордонні вчені довгий час вважали[], що вказівники винайшов у 1964-ому році [en].
Формальний опис
У інформатиці вказівник — це різновид посилання, але окремі мови програмування можуть вводити власну інтерпретацію цього поняття.
Примітивом даних (або просто примітив) є будь-які дані які можуть бути зчитані або записані в пам'ять комп'ютера за один такт доступу до пам'яті, наприклад, типи даних byte (байт) і word (машинне слово) є примітивами.
Сукупністю даних (англ. aggregate) є група примітивів, які логічно послідовні в пам'яті і розглядаються сумісно як єдині дані (наприклад, сукупністю можуть бути 3 логічно послідовні байти, значення яких, являє собою 3 координати точки в просторі). Коли сукупність складається з примітивів однакового типу, сукупність називається масивом; у деякому розумінні, багатобайтовий примітив word є масивом байтів, а в деяких програмах він використовується саме так.
У контексті цих визначень, byte є найменшим примітивом; кожна адреса в пам'яті визначає окремий байт. Адреса пам'яті початкового байту даних розглядається як адреса (або базова адреса пам'яті) всієї сукупності даних.
Вказівник на пам'ять (або просто вказівник) це примітив, значення якого за призначенням використовується як адреса пам'яті; це означає що вказівник вказує на адресу пам'яті. Це також означає, що вказівник вказує на дані [у пам'яті], якщо значення вказівника вказує на адресу даних у пам'яті.
Більш узагальнено, вказівник це різновид посилання, і вказівник посилається на дані, які зберігаються десь у пам'яті; для отримання цих даних виконується розіменування вказівника. Основною відмінністю вказівника від посилання є те, що значення вказівника інтерпретується як адреса в пам'яті, що є концепцією низького рівня.
Посилання служить як вид перенаправлення: значення вказівника визначає яка адреса пам'яті (тобто, які дані) використовуються під час обчислення. Оскільки перенаправлення є фундаментальним аспектом алгоритмів, вказівники часто вважаються фундаментальним типом даних у мовах програмування; у (статично) (або сильно) типізованих мовах програмування, тип вказівника визначає тип даних, на які посилається вказівник.
Операції з вказівниками
Мови програмування, у яких передбачений тип вказівник, містять зазвичай дві основні операції над ними: присвоювання і розіменування. Операція присвоювання записує в значення вказівника певну адресу в пам'яті комп'ютера.
Розіменування вказівника
Розіменування є частковим випадком так званої («штрих-операції») адресного програмування.
Операція отримання значення, на яке посилається вказівник, називається розіменування вказівника.
double a = 5; /* оголошення дійсної змінної подвійної точності */ double *pa; /* оголошення вказівника на дійсну змінну, вираз `double *` визначає тип, `pa` — ім'я вказівника */ pa = &a; /* присвоєння вказівнику адреси змінної `a`. `pa` тепер вказує на `a` */ *pa = 10; /* присвоєння значення за адресою, на яку вказує `pа`. `*a` — операція розіменування вказівника */
У результаті змінна a отримує значення 10.
Для пришвидшення обробки абстрактних типів даних багатократне розіменування було апаратно реалізовано як групова операція (з Ф-операцією операція модернізації адрес в ЕОМ «Київ») процесорів низки комп'ютерів: ЕОМ «Київ», «М-20», «Дніпро», сімейств (ВЕЛМ (ВЕЛМ-2, ВЕЛМ-3, ВЕЛМ-3М та ВЕЛМ-4), «Мінськ», «Урал» тощо. Це дозволило отримувати доступ до довільного елемента списку через виконання процесором лише однієї операції: адресації вищих рангів, яка є n-кратним застосуванням операції розіменування вказівника.[]
Масиви C/C++
У мовах програмування C/C++ індексування масивів формально визначено через арифметику вказівників; тобто, специфікація вимагає, щоб array[i]
було тотожним *(array + i)
. Отже в С/C++ імена масивів можна розглядати як вказівники на початкові елементи масиву, а елементи масиву як послідовні ділянки пам'яті (без прогалин). Водночас синтаксис для доступу до елементів є тотожним до того, який можна використовувати для розіменування вказівників. Наприклад, масив array
можна оголосити і використати так:
int array[5]; /* Оголошуємо 5 суміжних цілих чисел */ int *ptr = array; /* Масиви можна використовувати як вказівники */ ptr[0] = 1; /* Вказівники можна індексувати використовуючи синтаксис масивів */ *(array + 1) = 2; /* Масиви можна розіменовувати, використовуючи синтаксис вказівників */ *(1 + array) = 2; /* Додавання вказівників комутативне */ 2[array] = 4; /* Оператор індексування комутативний */
Тут виділено пам'ять під блок з п'яти цілих чисел і називаємо цей блок array
, цей ідентифікатор діє як вказівник на блок. Інше звичайне використання вказівників полягає в збереженні адреси на пам'ять динамічно виділену за допомогою , який повертає послідовний блок пам'яті не менш ніж запитаного розміру, яку можна використовувати як масив.
Ім'я масиву має тип вказівника, але не є вказівником — вказівник містить адресу, масив — елементи масиву. Як наслідок, хоча більшість операторів на масивах і вказівниках тотожні, оператор повертає для них різні значення. У цьому прикладі,
sizeof(array)
видасть 5*sizeof(int)
(розмір масиву), тоді як sizeof(ptr)
видасть sizeof(int*)
, розмір власне вказівника. Також справедливим є ptr = array
але помилковим array = ptr
.
Початково масив можна ініціалізувати так:
int array[5] = {2, 4, 3, 1, 5};
Якщо вважати, що array
розташований у пам'яті за адресою 0x1000 на 32-бітній little-endian машині, тоді пам'ять міститиме такі значення (адреси вказані в шістнадцятковій системі):
0 1 2 3 1000 2 0 0 0 1004 4 0 0 0 1008 3 0 0 0 100C 1 0 0 0 1010 5 0 0 0
Представлені тут п'ять цілих: 2, 4, 3, 1 і 5 займають по 4 байти кожне з першим найменш значущим байтом і розташовані послідовно починаючи з адреси 0x1000.
Синтаксис у C/C++ для вказівників такий:
array
значить 0x1000;array + 1
значить 0x1004;*array
значить розіменувати вмістarray
. Розглядаючи вміст як адресу пам'яті (0x1000), повернути значення за цією адресою (2);array[i]
: елемент масивуarray
з індексомi
(індексація починається з нуля).
Нульовий вказівник
Нульовий вказівник — це вказівник, який нікуди не вказує. Використовується для того, щоб показати, що дана зміна-вказівник ні на що не посилається. У різних мовах програмування представлений різними константами.
Див. також
Примітки
- Вказівник // Великий тлумачний словник сучасної української мови (з дод. і допов.) / уклад. і гол. ред. В. Т. Бусел. — 5-те вид. — К. ; Ірпінь : Перун, 2005. — .
- pointer // Англійсько-український словник з математики та інформатики / уклад. Є. Мейнарович, М. Кратко. — 2010.
- Videla, Alvaro (8 грудня 2018). . https://medium.com (англ.). A Computer of One’s Own Pioneers of the Computing Age. Архів оригіналу за 23 вересня 2020. Процитовано 30 жовтня 2020.
- Plauger, P J; Brodie, Jim (1992). ANSI and ISO Standard C Programmer's Reference. Redmond, WA: Microsoft Press. с. 108, 51. ISBN .
Тип масиву не містить додаткових дірок, тому що всі інші типи щільно пакуються коли компонуються в масив [сторінка 51]
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno gruden 2018 U Vikipediyi ye statti pro inshi znachennya cogo termina Pokazhchik Vkazivni k poka zhchik abo poka znik inodi takozh posilannya angl pointer abo reference tip danih u komp yuternih movah programuvannya ob yekt programi sho mistit adresu v pam yati komp yutera inshogo ob yekta Vkazivniki razom z operaciyeyu yih rozimenuvannya angl dereference operator buli vinajdeni Katerinoyu Logvinivnoyu Yushenko v 1955 r v adresnij movi programuvannya Za terminologiyeyu Yushenko rozimenuvannya vkazivnika nazivalosya shtrih operaciyeyu Zakordonni vcheni dovgij chas vvazhali dzherelo sho vkazivniki vinajshov u 1964 omu roci en Formalnij opisU informatici vkazivnik ce riznovid posilannya ale okremi movi programuvannya mozhut vvoditi vlasnu interpretaciyu cogo ponyattya Primitivom danih abo prosto primitiv ye bud yaki dani yaki mozhut buti zchitani abo zapisani v pam yat komp yutera za odin takt dostupu do pam yati napriklad tipi danih byte bajt i word mashinne slovo ye primitivami Sukupnistyu danih angl aggregate ye grupa primitiviv yaki logichno poslidovni v pam yati i rozglyadayutsya sumisno yak yedini dani napriklad sukupnistyu mozhut buti 3 logichno poslidovni bajti znachennya yakih yavlyaye soboyu 3 koordinati tochki v prostori Koli sukupnist skladayetsya z primitiviv odnakovogo tipu sukupnist nazivayetsya masivom u deyakomu rozuminni bagatobajtovij primitiv word ye masivom bajtiv a v deyakih programah vin vikoristovuyetsya same tak U konteksti cih viznachen byte ye najmenshim primitivom kozhna adresa v pam yati viznachaye okremij bajt Adresa pam yati pochatkovogo bajtu danih rozglyadayetsya yak adresa abo bazova adresa pam yati vsiyeyi sukupnosti danih Vkazivnik na pam yat abo prosto vkazivnik ce primitiv znachennya yakogo za priznachennyam vikoristovuyetsya yak adresa pam yati ce oznachaye sho vkazivnik vkazuye na adresu pam yati Ce takozh oznachaye sho vkazivnik vkazuye na dani u pam yati yaksho znachennya vkazivnika vkazuye na adresu danih u pam yati Bilsh uzagalneno vkazivnik ce riznovid posilannya i vkazivnik posilayetsya na dani yaki zberigayutsya des u pam yati dlya otrimannya cih danih vikonuyetsya rozimenuvannya vkazivnika Osnovnoyu vidminnistyu vkazivnika vid posilannya ye te sho znachennya vkazivnika interpretuyetsya yak adresa v pam yati sho ye koncepciyeyu nizkogo rivnya Posilannya sluzhit yak vid perenapravlennya znachennya vkazivnika viznachaye yaka adresa pam yati tobto yaki dani vikoristovuyutsya pid chas obchislennya Oskilki perenapravlennya ye fundamentalnim aspektom algoritmiv vkazivniki chasto vvazhayutsya fundamentalnim tipom danih u movah programuvannya u statichno abo silno tipizovanih movah programuvannya tip vkazivnika viznachaye tip danih na yaki posilayetsya vkazivnik Operaciyi z vkazivnikamiMovi programuvannya u yakih peredbachenij tip vkazivnik mistyat zazvichaj dvi osnovni operaciyi nad nimi prisvoyuvannya i rozimenuvannya Operaciya prisvoyuvannya zapisuye v znachennya vkazivnika pevnu adresu v pam yati komp yutera Rozimenuvannya vkazivnika Rozimenuvannya ye chastkovim vipadkom tak zvanoyi shtrih operaciyi adresnogo programuvannya Operaciya otrimannya znachennya na yake posilayetsya vkazivnik nazivayetsya rozimenuvannya vkazivnika U movi programuvannya S double a 5 ogoloshennya dijsnoyi zminnoyi podvijnoyi tochnosti double pa ogoloshennya vkazivnika na dijsnu zminnu viraz double viznachaye tip pa im ya vkazivnika pa amp a prisvoyennya vkazivniku adresi zminnoyi a pa teper vkazuye na a pa 10 prisvoyennya znachennya za adresoyu na yaku vkazuye pa a operaciya rozimenuvannya vkazivnika U rezultati zminna a otrimuye znachennya 10 Dlya prishvidshennya obrobki abstraktnih tipiv danih bagatokratne rozimenuvannya bulo aparatno realizovano yak grupova operaciya z F operaciyeyu operaciya modernizaciyi adres v EOM Kiyiv procesoriv nizki komp yuteriv EOM Kiyiv M 20 Dnipro simejstv VELM VELM 2 VELM 3 VELM 3M ta VELM 4 Minsk Ural tosho Ce dozvolilo otrimuvati dostup do dovilnogo elementa spisku cherez vikonannya procesorom lishe odniyeyi operaciyi adresaciyi vishih rangiv yaka ye n kratnim zastosuvannyam operaciyi rozimenuvannya vkazivnika dzherelo Masivi C C U movah programuvannya C C indeksuvannya masiviv formalno viznacheno cherez arifmetiku vkazivnikiv tobto specifikaciya vimagaye shob array i bulo totozhnim array i Otzhe v S C imena masiviv mozhna rozglyadati yak vkazivniki na pochatkovi elementi masivu a elementi masivu yak poslidovni dilyanki pam yati bez progalin Vodnochas sintaksis dlya dostupu do elementiv ye totozhnim do togo yakij mozhna vikoristovuvati dlya rozimenuvannya vkazivnikiv Napriklad masiv array mozhna ogolositi i vikoristati tak int array 5 Ogoloshuyemo 5 sumizhnih cilih chisel int ptr array Masivi mozhna vikoristovuvati yak vkazivniki ptr 0 1 Vkazivniki mozhna indeksuvati vikoristovuyuchi sintaksis masiviv array 1 2 Masivi mozhna rozimenovuvati vikoristovuyuchi sintaksis vkazivnikiv 1 array 2 Dodavannya vkazivnikiv komutativne 2 array 4 Operator indeksuvannya komutativnij Tut vidileno pam yat pid blok z p yati cilih chisel i nazivayemo cej blok array cej identifikator diye yak vkazivnik na blok Inshe zvichajne vikoristannya vkazivnikiv polyagaye v zberezhenni adresi na pam yat dinamichno vidilenu za dopomogoyu yakij povertaye poslidovnij blok pam yati ne mensh nizh zapitanogo rozmiru yaku mozhna vikoristovuvati yak masiv Im ya masivu maye tip vkazivnika ale ne ye vkazivnikom vkazivnik mistit adresu masiv elementi masivu Yak naslidok hocha bilshist operatoriv na masivah i vkazivnikah totozhni operator povertaye dlya nih rizni znachennya U comu prikladi sizeof array vidast 5 sizeof int rozmir masivu todi yak sizeof ptr vidast sizeof int rozmir vlasne vkazivnika Takozh spravedlivim ye ptr array ale pomilkovim array ptr Pochatkovo masiv mozhna inicializuvati tak int array 5 2 4 3 1 5 Yaksho vvazhati sho array roztashovanij u pam yati za adresoyu 0x1000 na 32 bitnij little endian mashini todi pam yat mistitime taki znachennya adresi vkazani v shistnadcyatkovij sistemi 0 1 2 31000 2 0 0 01004 4 0 0 01008 3 0 0 0100C 1 0 0 01010 5 0 0 0 Predstavleni tut p yat cilih 2 4 3 1 i 5 zajmayut po 4 bajti kozhne z pershim najmensh znachushim bajtom i roztashovani poslidovno pochinayuchi z adresi 0x1000 Sintaksis u C C dlya vkazivnikiv takij array znachit 0x1000 array 1 znachit 0x1004 array znachit rozimenuvati vmist array Rozglyadayuchi vmist yak adresu pam yati 0x1000 povernuti znachennya za ciyeyu adresoyu 2 array i element masivu array z indeksom i indeksaciya pochinayetsya z nulya Nulovij vkazivnikNulovij vkazivnik ce vkazivnik yakij nikudi ne vkazuye Vikoristovuyetsya dlya togo shob pokazati sho dana zmina vkazivnik ni na sho ne posilayetsya U riznih movah programuvannya predstavlenij riznimi konstantami U movi Pascal nil U movi C NULL U movi C 0 abo nullptr U movah Java C nullDiv takozhrestrictPrimitkiVkazivnik Velikij tlumachnij slovnik suchasnoyi ukrayinskoyi movi z dod i dopov uklad i gol red V T Busel 5 te vid K Irpin Perun 2005 ISBN 966 569 013 2 pointer Anglijsko ukrayinskij slovnik z matematiki ta informatiki uklad Ye Mejnarovich M Kratko 2010 Videla Alvaro 8 grudnya 2018 https medium com angl A Computer of One s Own Pioneers of the Computing Age Arhiv originalu za 23 veresnya 2020 Procitovano 30 zhovtnya 2020 Plauger P J Brodie Jim 1992 ANSI and ISO Standard C Programmer s Reference Redmond WA Microsoft Press s 108 51 ISBN 1 55615 359 7 Tip masivu ne mistit dodatkovih dirok tomu sho vsi inshi tipi shilno pakuyutsya koli komponuyutsya v masiv storinka 51 Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi