Кіріспе

Компьютерлік бағдарламада жад адрестерін сақтайтын объект. Компьютерлік ғылымда, нұсқауыш – көптеген бағдарламалау тілдерінде жад адрестерін сақтайтын объект. Бұл компьютер жадында орналасқан басқа мәннің адресі немесе кейбір жағдайларда, жадқа бейімделген компьютерлік аппараттың адресі болуы мүмкін. Нұсқауыш жадтағы бір орналасқан жерге сілтеме жасайды, ал сол жерде сақталған мәнді алу нұсқауышты жою деп аталады. Мысалы, кітаптың мазмұнындағы бет нөмірін сәйкес бетке жасалған сілтеме деп қарастыруға болады; мұндай сілтемені жою үшін берілген бет нөміріне ауысып, сол беттегі мәтінді оқу қажет. Нұсқауыш айнымалысының нақты форматы мен мазмұны компьютерлік архитектураға байланысты. Нұсқауыштарды пайдалану қайталанатын операциялардың өнімділігін, мысалы, итерацияланатын дерек құрылымдарды (мысалы, тізбектерді, іздеу кестелерін, басқару кестелерін және ағаш құрылымдарын) қарауды айтарлықтай жақсартады. Әсіресе, уақыт және жад тұрғысынан, нұсқауыштарды көшіру және олардан мән алу, нұсқауыштар көрсеткен деректерді көшіру және оларға қол жеткізуден әлдеқайда тиімді. Нұсқауыштар процедуралық бағдарламалауда шақырылған кіші бағдарламалардың кіру нүктелерінің адрестерін сақтау үшін, сондай-ақ динамикалық байланыс кітапханаларына (DLL) орындалу уақытында байланысу үшін де қолданылады. Объектіге бағытталған бағдарламалауда функцияларға жасалған сілтемелер әдістерді байланыстыру үшін қолданылады, көбінесе виртуалды әдіс кестелерін пайдаланады. Нұсқауыш – абстрактілірек дерек типінің қарапайым, нақтырақ іске асырылуы. Көптеген тілдер, әсіресе төменгі деңгейдегі тілдер, нұсқауыштардың кейбір түрлерін қолдайды, бірақ кейбіреулерінде оларды қолдануға басқаларына қарағанда көбірек шектеулер қойылады. "Нұсқауыш" жалпы сілтемелерді атау үшін қолданылса да, ол дерек құрылымдарына дұрыс қолданылады, олардың интерфейсі нұсқауышты арифметикалық амалдар арқылы жад адресі ретінде өңдеуге мүмкіндік береді, ал сиқырлы cookie немесе мүмкіндік мұндай мүмкіндік бермейді. Нұсқауыштар жад адрестеріне қорғалған және қорғалмаған қол жеткізуге мүмкіндік беретіндіктен, оларды пайдаланумен байланысты тәуекелдер бар, әсіресе соңғы жағдайда. Бастапқы нұсқауыштар көбінесе бүтін санға ұқсас форматта сақталады; алайда, құндылығы жарамды жад адресі емес мұндай нұсқауышты жоюға тырысу бағдарламаның құлауына (немесе жарамсыз деректерге әкелуіне) себеп болуы мүмкін. Бұл әлеуетті мәселені азайту үшін, типтік қауіпсіздік принципі ретінде, нұсқауыштар олар көрсеткен деректердің түріне қарай параметрленген жеке тип ретінде қарастырылады, тіпті негізгі өрнегі бүтін сан болса да. Басқа шаралар да қолданылуы мүмкін (мысалы, тексеру және шектеулерді тексеру), бұл нұсқауыш айнымалысында жарамды жад адресі және процессордың қолдауындағы сандық диапазонға сәйкес келетін мән бар екенін тексеру үшін.

Тарих

1955 жылы советтік украин ғалымы Катерина Ющенко адрестеуді жүзеге асырып, жоғары деңгейдегі адрестерді – көрсеткіштерге ұқсас мүмкіндіктерді жасады. Бұл тіл КСРО компьютерлерінде кеңінен қолданылды. Дегенмен, ол КСРО шегінен тыс жерлерде белгілі болған жоқ, ал көрсеткіштерді 1964 жылы Harold Lawson ойлап тапқан деп есептеледі. 2000 жылы Лоусонға IEEE “[f] pointer айнымалысын ойлап тапқаны және бұл тұжырымды PL/I тіліне енгізгені үшін, осылайша алғаш рет байланысты тізімдерді жалпы мақсаттағы жоғары деңгейдегі тілде икемді түрде өңдеуге мүмкіндік бергені үшін” компьютерлік пионер сыйлығы табысталды. Оның осы концепцияларға арналған мақаласы 1967 жылғы маусымда CACM журналында «PL/I List Processing» деген атпен жарияланды. Оксфорд ағылшын сөздігінде «pointer» сөзі алғаш рет System Development Corporation компаниясының техникалық ескертпесінде стек көрсеткіші ретінде басылған.

Ресми сипаттама

Компьютерлік ғылымда көрсеткіш – сілтеменің бір түрі. Дерек примитиві (немесе просто примитив) – компьютер жадынан бір жадқа қол жеткізу арқылы оқуға немесе жазуға болатын кез келген дерек (мысалы, байт және сөз – примитивтер). Дерек жиынтығы (немесе просто жиынтық) – жадыда логикалық тұрғыдан біріккен және бір дерек ретінде қарастырылатын примитивтердің тобы (мысалы, жиынтық 3 логикалық тұрғыдан біріккен байттан тұруы мүмкін, олардың мәндері кеңістіктегі нүктенің 3 координатасын көрсетеді). Егер жиынтық бір типті примитивтерден ғана құралса, онда оны массив деп атауға болады; белгілі бір мағынада, көп байттық сөз примитиві – байттар массиві, ал кейбір бағдарламалар сөздерді осылай қолданады. Көрсеткіш – компьютерлік ғылымда мәнді немесе объектіні сақтайтын жад орнын көрсету немесе сілтемелеу үшін қолданылатын бағдарламалау түсінігі. Бұл, негізінен, деректерді сақтаудың орнына басқа айнымалының немесе дерек құрылымының жад мекенжайын сақтайтын айнымалы. Көрсеткіштер әдетте C және C++ сияқты жадты тікелей басқаруды қолдайтын бағдарламалау тілдерінде қолданылады. Олар бағдарламашыларға жадпен тікелей жұмыс істеуге мүмкіндік береді, бұл жадты тиімді басқаруға және күрделірек дерек құрылымдарын құруға жол ашады. Көрсеткіштерді пайдалану арқылы жадтағы деректерге қол жеткізуге және өзгертуге, функциялар арасында деректерді тиімді түрде жіберуге, сондай-ақ тізімдер, ағаштар және графтар сияқты динамикалық дерек құрылымдарын жасауға болады. Қарапайым тілмен айтқанда, көрсеткішті компьютер жадындағы нақты бір орынға нұсқайтын жебе ретінде көзге елестете аласыз, бұл сізге сол жерде сақталған деректермен өзара әрекеттесуге мүмкіндік береді. Жад көрсеткіші (немесе просто көрсеткіш) – примитив, оның мәні жад мекенжайы ретінде пайдаланылуы тиіс; көрсеткіш жад мекенжайына нұсқайды делінеді. Сондай-ақ, егер көрсеткіштің мәні деректің жад мекенжайына тең болса, онда көрсеткіш дерекке [жадта] нұсқайды деуге болады. Жалпы алғанда, көрсеткіш – сілтеменің бір түрі, және көрсеткіш жадыда сақталған дерекке нұсқайды делінеді; бұл деректі алу – көрсеткішті жою. Көрсеткіштерді басқа сілтеме түрлерінен ерекшелейтін ерекшелік – көрсеткіштің мәні жад мекенжайы ретінде түсіндіріледі, бұл өте төмен деңгейдегі түсінік. Сілтемелер жанамалық деңгейі ретінде қызмет етеді: Көрсеткіштің мәні есептеуде қай жад мекенжайы (яғни қай дерек) пайдаланылатынын анықтайды. Жанамалық алгоритмдердің негізгі аспектісі болғандықтан, көрсеткіштер бағдарламалау тілдерінде негізгі дерек түрі ретінде жиі ұсынылады; статикалық (немесе күшті) типтелген бағдарламалау тілдерінде көрсеткіштің түрі көрсеткіштің нұсқайтын деректің түрін анықтайды.

Сәулет негіздері

Пойнтерлер – қазіргі заманғы архитектуралардың көпшілігі ұсынатын адрестеу мүмкіндіктерінің үстіне салынатын өте жұқа абстракция. Ең қарапайым схемада жүйедегі әр жад бірлігіне мекенжай немесе сандық индекс тағайындалады, мұнда бірлік әдетте байт немесе сөз болып табылады – архитектура байттық адрестеуге немесе сөздік адрестеуге бағытталғандығына байланысты, бұл барлық жадты өте үлкен массивке айналдырады. Сондай-ақ жүйе берілген мекенжайдағы жад бірлігінде сақталған мәнді алуға мүмкіндік беретін операцияны қамтамасыз етеді (әдетте машинаның жалпы мақсаттағы регистрлерін пайдалана отырып). Көбінесе, пойнтер жүйедегі жад бірліктерінің санынан артық мекенжайды сақтауға жетеді. Бұл бағдарламаның жад бірлігіне сәйкес келмейтін мекенжайға қол жеткізуге тырысу мүмкіндігін тудырады, себебі жеткілікті жад орнатылмаған (яғни қолжетімді жадтың шегінен тыс) немесе архитектура мұндай мекенжайларды қолдамайды. Бірінші жағдай, мысалы, Intel x86 архитектурасында сегментациялық қате (segfault) деп аталуы мүмкін. Екінші жағдай қазіргі AMD64 іске асырылымында мүмкін, онда пойнтерлер 64 биттік, ал мекенжайлар 48 биттік болып келеді. Пойнтерлер белгілі бір ережелерге (каноникалық мекенжайлар) сәйкес болуы керек, сондықтан каноникалық емес пойнтер дереференцияланса, процессор жалпы қорғаныс қатесін тудырады. Ал кейбір жүйелерде мекенжайлар санынан артық жад бірліктері болады. Мұндай жағдайда жадты сегменттеу немесе беттеу сияқты күрделі схема қолданылады, ол жадтың әртүрлі бөліктерін әртүрлі уақытта пайдалануға мүмкіндік береді. x86 архитектурасының соңғы нұсқалары 36 биттік физикалық жад мекенжайларын қолдайды, олар PAE беттеу механизмі арқылы 32 биттік сызықтық мекенжай кеңістігіне бейімделеді. Осылайша, бір уақытта барлық жадтың тек 1/16 бөлігіне ғана қол жеткізуге болады. Сол компьютерлік отбасының тағы бір мысалы – 80286 процессорының 16 биттік қорғалған режимі, ол тек 16 МБ физикалық жадыны қолдай отырып, 1 ГБ дейін виртуалды жадқа қол жеткізе алатын, бірақ 16 биттік мекенжай және сегменттік регистрлердің үйлесімі бір дерек құрылымында 64 КБ-тан астам деректерге қол жеткізуді қиындатады. Тұрақты интерфейс беру үшін кейбір архитектуралар жадқа бейімделген I/O-ны ұсынады, бұл кейбір мекенжайлардың жад бірліктеріне, ал басқалары компьютердегі басқа құрылғылардың құрылғы регистрлеріне сілтеме жасауына мүмкіндік береді. Файл офсеттері, массивтік индекстер және басқа нысандардың мекенжайлары сияқты, басқа нысандар үшін де мекенжайлардың кейбір мақсаттарына қызмет ететін қашықтағы нысан сілтемелері сияқты ұқсас түсініктер бар.

Қолданылуы

Пойнтерлер PL/I, C, C++, Pascal, FreeBASIC сияқты тілдерде және көптеген ассемблер тілдерінде шектеусіз тікелей қолдауға ие. Олар негізінен сілтемелер құру үшін қолданылады, ал сілтемелер өз кезегінде дерлік барлық дерек құрылымдарын құру үшін, сондай-ақ бағдарламаның әртүрлі бөліктері арасында деректерді беру үшін маңызды. Тізімдерге көп сүйенетін функционалдық бағдарламалау тілдерінде деректерге сілтемелер cons және сәйкес элементтер car және cdr сияқты қарапайым құрылымдарды пайдалану арқылы абстрактілі түрде басқарылады, оларды cons жасушасының бірінші және екінші компоненттеріне арналған мамандандырылған сілтемелер деп қарастыруға болады. Бұл функционалдық бағдарламалаудың ерекше ерекшеліктеріне әкеледі. Деректерді осындай cons тізімдерінде құрылымдау арқылы, бұл тілдер деректерді құру және өңдеудің рекурсивті әдістерін жеңілдетеді, мысалы, тізімдердің тізімдерінің бас және құйрық элементтеріне рекурсивті түрде қол жеткізу арқылы; мысалы, "cdr-дың cdr-ының car-ын алу". Керісінше, жад адрестерінің массивіне жуықтап қарағанда, көрсеткішті қайта сілтемелеуге негізделген жад басқаруы айнымалыларды деректерді императивті түрде тағайындауға болатын орын ретінде қарастыруға мүмкіндік береді. Массивтермен жұмыс істегенде, маңызды іздеу операциясы әдетте массивтегі қажетті дерек элементіне көрсеткіш құруды қамтитын мекенжай есептеуі деп аталатын кезеңді қамтиды. Басқа дерек құрылымдарында, мысалы, тізбекті тізімдерде, көрсеткіштер құрылымның бір бөлігін екіншісімен тікелей байланыстыратын сілтемелер ретінде қолданылады. Көрсеткіштер параметрлерді сілтеме арқылы беру үшін қолданылады. Егер бағдарламашы функцияның параметрге енгізген өзгерістерін функцияны шақырушыға көрінетін еткісі келсе, бұл пайдалы. Бұл функциядан бірнеше мәнді қайтару үшін де пайдалы. Көрсеткіштер жадтағы динамикалық айнымалылар мен массивтерді бөлу және босату үшін де қолданылуы мүмкін. Өзгергіш өз мақсатына жеткеннен кейін көбінесе қажетсіз болып қалатындықтан, оны сақтау жадты ысыраптап тастау болады, сондықтан оны қажет болмаған кезде (түпнұсқалық көрсеткіш сілтемесін пайдалану арқылы) босату жақсы тәжірибе. Олай етпеу жад ағымына әкелуі мүмкін (бос жад біртіндеп немесе ауыр жағдайларда көптеген қажетсіз жад блоктарының жиналуынан жылдам азаяды).

Деректер құрылымында пайдалану

Тізімдер, кезектер және ағаштар сияқты дерек құрылымдарын құру кезінде, құрылымның іске асылуын және басқарылуын ұйымдастыруға көмектесетін көрсеткіштер қажет. Көрсеткіштердің типік мысалдары – бастапқы көрсеткіш, соңғы көрсеткіш және стек көрсеткіші. Бұл көрсеткіштер абсолютті (нақты физикалық немесе виртуалды жадтағы виртуалды мекенжай) немесе салыстырмалы (әдетте толық мекенжайдан аз биттерді пайдаланатын абсолютті бастапқы мекенжайдан ("базалық") ауытқу) болуы мүмкін, бірақ әдетте оны анықтау үшін қосымша арифметикалық операция қажет. Салыстырмалы мекенжайлар – жадты қолмен сегменттеудің бір түрі және оның көптеген артықшылықтары мен кемшіліктері бар. 16 биттік, таңбасы жоқ бүтін санды қамтитын екі байттық ауытқу, 64 КиБ (216 байт) көлеміндегі дерек құрылымы үшін салыстырмалы мекенжайлеуді қамтамасыз етуге қолданылуы мүмкін. Егер көрсеткіш мекенжай жартылай сөз, сөз немесе қос сөз шекарасында тураласа, оны 128, 256 немесе 512 КиБ-қа дейін оңай кеңейтуге болады (бірақ базалық мекенжайға қосу алдында ауытқуды 2, 4 немесе 8 еселеу үшін қосымша "солға қарай жылжыту" биттік операциясы – 1, 2 немесе 3 битпен – қажет). Дегенмен, мұндай схемалар көбінесе қиындық тудырады, сондықтан бағдарламашының ыңғайлылығы үшін абсолютті мекенжайлар (және оның негізіндегі, жазық мекенжай кеңістігі) артықшылыққа ие. Бір байттық ауытқу, мысалы, таңбаның ASCII алтылық мәні (мысалы, X'29') массивтегі (мысалы, X'01') баламалы бүтін санға (немесе индекске) сілтеме жасау үшін қолданылуы мүмкін. Осылайша, таңбаларды "шикі деректерден" пайдалануға болатын тізбекті индекске, содан кейін іздеу кестесінсіз абсолютті мекенжайға өте тиімді түрлендіруге болады.

Пойнтерлердің мәні

C және C++ тілдерінде екі көрсеткіш тең деп салыстырылса да, олар эквивалентті екенін білдірмейді. Бұл тілдерде және LLVM-де ереже "екі көрсеткіш бірдей мекенжайға нұсқаса, оларды бір-бірінің орнына қолдануға болады деген мағынада тең емес" деп түсіндіріледі, көрсеткіштердің арасындағы осы айырмашылық олардың шығу тегі деп аталады. uintptr_t сияқты бүтін сан түріне түрлендіру – орындалуға қатысты анықталмаған, ал оның салыстыруы екі көрсеткішті бір-бірімен алмастыруға болатыны туралы қосымша мәлімет бермейді. Сонымен қатар, байттарға одан әрі түрлендіру және арифметикалық амалдар көрсеткіштерді пайдалануды қадағалауға тырысатын оптимизаторларды жаңылыстырады, бұл мәселе әлі де академиялық зерттеулерде зерделенуде.

Пойнтерлерді қауіпсіз ету

Пойнтерлер бағдарламаға анықталмаған нысанға қол жеткізуге мүмкіндік беретіндіктен, көрсеткіштер түрлі бағдарламалау қателерінің туындауына себеп болуы мүмкін. Дегенмен, көрсеткіштердің пайдалылығы соншалық, оларсыз бағдарламалау тапсырмаларын орындау қиынға соғуы мүмкін. Осылайша, көптеген тілдер көрсеткіштердің пайдалы мүмкіндіктерін сақтай отырып, олардың кемшіліктерінен құтылуға бағытталған конструкцияларды жасады. Осы контексте, жадқа тікелей мекенжай беретін (осы мақалада қолданылған) көрсеткіштер, «шикі көрсеткіштер» деп аталады, ал «ақылды көрсеткіштер» немесе басқа да түрлерінен ерекшеленеді. Көрсеткіштердің басты мәселесі – оларды сан ретінде өңдеуге болады, сондықтан оларды пайдаланылмаған жад мекенжайларына немесе басқа мақсаттар үшін қолданылатын деректерге бағыттауға болады. Көптеген тілдер, соның ішінде функционалдық бағдарламалау тілдерінің көпшілігі және Java сияқты жаңа императивті тілдер, көрсеткіштерді көбінесе жай ғана «сілтеме» деп аталатын, көбірек жасырын түрдегі сілтемемен алмастырады. Мұндай сілтемелерді тек нысандарға сілтеме жасау үшін қолдануға болады және оларды сан ретінде өңдеуге болмайды, бұл осы типтегі қателердің алдын алады. Массивтерге қол жеткізу ерекше жағдай ретінде қарастырылады. Ешқандай мекенжайы жоқ көрсеткіш «жапайы көрсеткіш» деп аталады. Мұндай инициализацияланбаған көрсеткіштерді пайдалану әртүрлі себептерге байланысты күтпеген әрекеттерге әкелуі мүмкін: бастапқы мән жарамсыз мекенжай болуы мүмкін немесе оны пайдалану бағдарламаның басқа бөліктеріне зиян келтіруі мүмкін. Мұның салдары сегментация қатесі, жад бұзушылығы немесе жапайы тармақталу (егер көрсеткіш функцияға сілтеме ретінде немесе тармақталу мекенжайы ретінде қолданылса) болуы мүмкін. Жадыны тікелей бөлу жүйелерінде, көрсеткіш нұсқаған жад аймағын босату арқылы «аспалы көрсеткішті» жасауға болады. Бұл типтегі көрсеткіш қауіпті және анықталмауы қиын, себебі босатылған жад аймағында бұрынғы деректер сақталуы мүмкін, бірақ кейін басқа кодпен қайта бөлініп, жаңа деректермен жазылуы мүмкін, бұл туралы бұрынғы кодқа хабар берілмейді. Қоқыс жинағыштары бар тілдер мұндай қателердің пайда болуын болдырмайды, себебі сілтемелер жойылған кезде жадты босату автоматты түрде жүзеге асырылады. Кейбір тілдер, мысалы C++, «ақылды көрсеткіштерді» қолдайды, олар динамикалық жадты бөлуді қадағалауға көмектесетін сілтемелерді санаудың қарапайым түрін пайдаланады. Сілтеме циклы болмаған жағдайда, яғни нысан өзін ақылды көрсеткіштер тізбегі арқылы жанама түрде сілтегенде, аспалы көрсеткіштер мен жадтың ағуы мүмкіншілігі жойылады. Delphi тіліндегі жолдар сілтемелерді санауды табиғи түрде қолдайды. Rust бағдарламалау тілі қарыз алуды тексеруші, көрсеткіштердің өмір сүру мерзімін бақылау және нөлдік көрсеткіштер үшін опциялық түрлерге негізделген оңтайландыруды енгізеді, бұл көрсеткіштерге байланысты қателерді жоюға мүмкіндік береді, қоқыс жинағыштарын пайдаланбастан.

Нөлді меңзер

Нөлдік көрсеткіштің мәні, көрсеткіштің жарамды нысанға сілтеме жасамайтынын білдіру үшін резервтелген. Нөлдік көрсеткіштер әдетте белгісіз ұзындығы бар тізімнің соңына жеткенді немесе кейбір амал орындалмағанын көрсету үшін қолданылады; мұндай нөлдік көрсеткіштерді қолдану nullable типтерімен және опция түріндегі Nothing мәнімен салыстыруға болады.

Жабайы бұтақ

Егер нұсқаушы бағдарламаның кіріс нүктесінің мекенжайы ретінде немесе ештеңе қайтармайтын, инициализацияланбаған немесе зақымдалған функцияның басталуы ретінде қолданылса, және бұл мекенжайға шақыру немесе секіру жасалса, онда "бақылаусыз өту" орын алды делінеді. Басқаша айтқанда, бақылаусыз өту – бұл бақылаусыз (қалқып тұрған) функцияның нұсқаушысы. Салдары әдетте болжамсыз болады және қате нұсқаушының "жарамды" мекенжайға және (сәйкес келсе) сол мекенжайда жарамды командаға (опкодқа) ие болуына байланысты әртүрлі жолдармен көрініс беруі мүмкін. Бақылаусыз өтуді анықтау өте қиын және көңілді жөндеу жұмысы болуы мүмкін, себебі көптеген дәлелдер бұрын жойылған немесе өту орнындағы бір немесе бірнеше қате командалардың орындалуы нәтижесінде жойылған болуы мүмкін. Бар болса, командалар жиынтығының симуляторы бақылаусыз өтуді оның әсер етуінен бұрын анықтап қана қоймай, сонымен қатар оның тарихының толық немесе ішінара іздерін ұсынуы мүмкін.

Басты меңзер

Негізгі көрсеткіш – екінші көрсеткіштің мәніне қатысты смещение (ауытқу) болып табылатын көрсеткіш. Оны деректер блогын сақтау және жүктеу үшін пайдалануға болады, осы ретте блоктың басындағы адресі негізгі көрсеткішке беріледі.

Артқы көрсеткіші

Екі есе байланысқан тізімдерде немесе ағаш құрылымдарындағы элементте сақталатын кері сілтеме, ағымдағы элементтің қайдан келгенін көрсететін элементке сілтеме жасайды. Бұл навигация мен өңдеу үшін пайдалы, бірақ жадты көп пайдалануға әкеледі.

Массивтік индексті пайдалану симуляциясы

Пойнтердің мінез-құлқын индексті (әдетте бір өлшемді) массивке қолдану арқылы симуляциялауға болады. Атап айтқанда, сілтемелерді тікелей қолдамайтын, бірақ массивтерді қолдайтын тілдер үшін, массивті белгілі бір массив шегіндегі жадтың толық диапазоны ретінде қарастырып, оны өңдеуге болады. Массивке кез келген индекс, ассемблерлік тілдегі жалпы мақсаттағы тіркелімге тең деп есептелуі мүмкін (ол жеке байттарға сілтеме жасайды, бірақ оның нақты мәні массивтің басына қатысты, жадтағы абсолютті мекенжайы емес). Мысалы, массивті 16 мегабайттық үздіріссіз таңбалық дерек құрылымы деп есептесек, жеке байттарды (немесе массивтегі үздіріссіз байттар тізбегін) массивтің атын пайдаланып тікелей адрестеуге және өңдеуге болады. 31 биттік таңбасы жоқ бүтін сан симуляцияланған көрсеткіш ретінде қолданылады (бұл жоғарыда көрсетілген C массивтерінің мысалына өте ұқсас). Пойнтерлік арифметиканы индекске қосу немесе алу арқылы, нақты пойнтерлік арифметикамен салыстырғанда минималды қосымша шығындармен симуляциялауға болады. Теориялық тұрғыдан алғанда, жоғарыда аталған әдісті пайдаланып, тиісті машиналық кодты симуляциялаушыға арналған инструкциялар жинағы арқылы кез келген машиналық кодты немесе кез келген процессордың/тілдің аралық (байт-кодын) сілтемелерді ешқайсысын қолдамайтын басқа тілде (мысалы, Java / JavaScript) симуляциялауға болады. Мұны іске асыру үшін, бинарлық код бастапқыда симуляциялаушының "оқуы", түсіндіруі және сол массивтің жадында толыққанды әрекет етуі үшін массивтің үздіріссіз байттарына жүктеледі. Қажет болған жағдайда, буферлік ағын проблемаларын толыққанды болдырмау үшін, шекаралық тексерулер әдетте компиляторда орындалады (немесе болмаса, симуляциялаушыда қолмен кодталады).

Аида

Ada - бұл барлық көрсеткіштері терілген және тек қауіпсіз түрге түрлендіруге рұқсат етілген күшті терілген тіл. Барлық көрсеткіштер әдепкі бойынша null мәнімен инициализацияланады, ал null көрсеткіш арқылы деректерге қол жеткізуге тырысу қателікке (exception) әкеледі. Ada-дағы көрсеткіштер кіру типтері (access types) деп аталады. Ada 83 кіру типтерінде арифметикалық амалдарға рұқсат бермеді (дегенмен көптеген компилятор жеткізушілері оны стандартты емес мүмкіндік ретінде ұсынды), бірақ Ada 95 жүйелік пакет арқылы кіру типтеріндегі "қауіпсіз" арифметиканы қолдайды. Сақтау элементтері.

COBOL

COBOL бағдарламалау тілі айнымалыларға сілтемелерді қолдайды. Бағдарламаның LINKAGE SECTION бөлімінде жарияланған қарапайым немесе топтық (жазба) дерек объектілері бастапқыда сілтеме негізінде құрылады, онда бағдарлама ішінде дерек элементінің мекенжайы үшін ғана жад бөлінеді (әдетте бір жад сөзі). Бағдарламаның бастапқы кодында бұл дерек элементтері басқа жұмыс жадындағы айнымалылар сияқты қолданылады, бірақ олардың мазмұнына LINKAGE сілтемелері арқылы тікелей емес, жанама түрде қол жеткізіледі. Сілтеме жасалған әрбір дерек объектісі үшін жад кеңістігі әдетте сыртқы CALL операторларын немесе EXEC CICS немесе EXEC SQL операторлары сияқты енгізілген кеңейтілген тіл құрылымдары арқылы динамикалық түрде бөлінеді. COBOL-дың кеңейтілген нұсқалары USAGE IS POINTER өрнегімен жарияланған сілтеме айнымалыларын да ұсынады. Мұндай сілтеме айнымалыларының мәндері SET және SET ADDRESS операторларын қолдану арқылы белгіленеді және өзгертіледі. COBOL-дың кейбір кеңейтілген нұсқалары орындалатын кодтың мекенжайларын сақтай алатын PROCEDURE POINTER айнымалыларын да ұсынады.

PL/I

PL/I тілі барлық дерек түрлеріне (құрылымдарға көрсеткіштерді қоса), рекурсияға, көп тапсырмалылыққа, жолдарды өңдеуге және кеңейтілген кіріктірілген функцияларға толық қолдау көрсетеді. PL/I өз заманының бағдарламалау тілдерімен салыстырғанда үлкен қадам болды. PL/I көрсеткіштері типтелмеген, сондықтан көрсеткішті дереу қолдану немесе тағайындау үшін түрлендіру қажет емес. Көрсеткішті жариялау синтаксисі: DECLARE xxx POINTER; , бұл "xxx" деп аталатын көрсеткішті жариялайды. Көрсеткіштер BASED айнымалыларымен қолданылады. BASED айнымалы әдепкі орналасуымен (DECLARE xxx BASED(ppp);) немесе одан без (DECLARE xxx BASED;) жариялануы мүмкін, мұнда xxx – элементтік айнымалы, құрылым немесе массив болуы мүмкін, ал ppp – әдепкі көрсеткіш. Мұндай айнымалы нақты көрсеткішсіз (xxx=1;), немесе әдепкі орналасуға (ppp), немесе кез келген басқа көрсеткішке (qqq >xxx=1;) сілтеме арқылы адрестелуі мүмкін. Көрсеткіш арифметикасы PL/I стандартының бөлігі емес, бірақ көптеген компиляторлар ptr = ptr±expression түріндегі өрнектерге рұқсат береді. IBM PL/I арифметиканы орындау үшін PTRADD кіріктірілген функциясына ие. Көрсеткіш арифметикасы әрқашан байттармен орындалады. IBM Enterprise PL/I компиляторлары HANDLE деп аталатын жаңа типтегі көрсеткішке ие.

D

D бағдарламалау тілі C және C++ тілдерінен туындаған, C көрсеткіштерін және C типтік түрлендіруін толық қолдайтын тіл.

Эйфел

Эйфель объектіге бағытталған тілі мәндік және сілтемелік семантиканы қолданады, бірақ көрсеткіштер арифметикасын пайдаланбайды. Дегенмен, көрсеткіш сыныптары ұсынылады. Олар көрсеткіштер арифметикасы, типке келтіру, жадты нақты басқару, Эйфель емес бағдарламалық құралдармен байланысу және басқа мүмкіндіктерді қамтиды.

Жүре беріңіз

Go-ның нұсқаулары бар. Оның жариялау синтаксисі C-ге ұқсас, бірақ керісінше жазылады, типпен аяқталады. C-ден өзгеше, Go-да қоқыс жинағы бар және нұсқаулар арқылы арифметикалық амалдар жасауға рұқсат етілмейді. C++-тағы сияқты анықтама типтері жоқ. Кейбір кіріктірілген типтер, мысалы, карталар мен арналар, қорапталған (яғни, ішкі жағынан өзгертілетін құрылымдарға нұсқаулар), және олар make функциясы арқылы бастамаланады. Нұсқаулар мен нұсқау емес шамалар арасындағы біртұтас синтаксис үшін жебе (>) операторы алынып тасталды: нұсқау арқылы сілтемеленген объектінің өрісіне немесе әдісіне сілтеме жасау үшін нүкте операторы қолданылады. Дегенмен, бұл тек бір деңгейлі сілтеме үшін ғана жұмыс істейді.

Жава

Java-да көрсеткіштердің тікелей бейнеленуі жоқ. Оның орнына, нысандар мен массивлер сияқты күрделірек дерек құрылымдары сілтемелер арқылы іске асырылады. Тілде көрсеткіштермен жұмыс істеуге арналған тікелей операторлар қарастырылмаған. Дегенмен, код нөлдік сілтемені (нөлдік көрсеткіш) ашуға тырысуы мүмкін, нәтижесінде орындалу кезінде қателік туындайды. Сілтемесіз жад объектілерімен алынған орын, орындалу кезінде автоматты түрде қоқыс жинау арқылы босатылады.

Модуль-2

Пойнтерлер Паскаль тіліндегідей, процедура шақыруларындағы VAR параметрлері де солай іске асырылады. Modula 2 тілі Pascal-дан тіпті де қатаң түрде типтелген, типтік жүйеден қашуға мүмкіндіктер азырақ. Modula 2-нің кейбір түрлері (мысалы, Modula 3) қоқыс жинау функциясын қамтиды.

Оберон

Modula 2-дегідей, көрсеткіштер қол жетімді. Типтік жүйеден қашудың мүмкіндіктері бұрынғыдан азайды, сондықтан Оберон және оның түрлері көрсеткіштерге қатысты Модула 2 және оның түрлерінен гөрі қауіпсіз. Modula 3-тегідей, қоқыс жинау тіл спецификациясының бір бөлігі болып табылады.

Паскаль

Көптеген тілдерде пойнтерлер болса, стандартты ISO Pascal тек динамикалық түрде құрылған, аты жоқ айнымалыларға сілтеме жасауға рұқсат береді және стандартты статикалық немесе жергілікті айнымалыларға сілтеме жасауға рұқсат бермейді. Онда пойнтерлік арифметика жоқ. Сондай-ақ, пойнтерлердің сәйкес келетін түрі болуы керек, ал бір түріне жасалған пойнтер екінші түріне жасалған пойнтермен үйлесімсіз (мысалы, `char` пойнтері `integer` пойнтерімен үйлесімсіз). Бұл басқа пойнтерлердің, әсіресе PL/I немесе C үшін қолданылатындардың, тудыратын қауіпсіздік мәселелерін болдырмауға көмектеседі. Бұған қоса, «ілулі» пойнтерлерден туындайтын кейбір тәуекелдер де азаяды, бірақ сілтемеленген жадты динамикалық түрде босату мүмкіндігі (C-дегі `free` кітапханалық функциясы сияқты әсер етеді) «ілулі» пойнтерлердің тәуекелі толығымен жойылмайтынын білдіреді. Дегенмен, кейбір коммерциялық және ашық кодты Pascal (немесе оның туындылары) компиляторларында – мысалы, Free Pascal, Turbo Pascal немесе Embarcadero Delphi-дегі Object Pascal – пойнтерге стандартты статикалық немесе жергілікті айнымалыларға сілтеме жасауға рұқсат етіледі және бір пойнтер түрін екіншісіне түрлендіруге болады. Сонымен қатар, пойнтерлік арифметика шексіз: пойнтерге санды қосу немесе алу оны сол санға сәйкес байттар санымен екі бағытта да жылжытады, бірақ онымен `Inc` немесе `Dec` стандартты процедураларын қолданса, пойнтер сілтеме жасайтын дерек түрінің мөлшеріне сәйкес жылжытылады. `Pointer` деген атаумен типтелмеген пойнтер де қарастырылған, ол басқа пойнтер түрлерімен үйлесімді.

Perl (жазу)

Perl бағдарламалау тілі, көбінесе қолданылмайтын болса да, pack және unpack функциялары арқылы көрсеткіштерді қолдайды. Бұл функциялар тек компиляцияланған операциялық жүйе кітапханаларымен қарапайым өзара әрекеттесу үшін көзделген. Басқа жағдайларда Perl сілтемелерді пайдаланады, олар типтелген және ешқандай көрсеткіш арифметикасына жол бермейді. Олар күрделі деректер құрылымдарын жасау үшін қолданылады.