И двата указателя и референцията са най-мощните функции в C и C ++, които позволяват на програмистите да управляват директно адреса на паметта за ефективно управление на паметта.
И двете са променливи, които се използват за индиректно посочване на други обекти и споделят някои общи характеристики на повърхността. Въпреки че споделят много общи възможности, те също са много сложни за разбиране.
Показалец е променлива, която държи адреса на паметта на друга променлива, докато референцията е като показалец, който може да се използва за индиректно препращане към друга променлива.
Повечето програмисти изглежда развиват разбиране за това кога да използват указатели и кога да използват препратки, но често срещат проблеми, чието решение изглежда неясно.
Затова, за да разберем по-добре философията, нека разберем разликата между двете.
Всяка променлива е място в паметта, което се определя от неговия адрес и е сдвоено с идентификатор, който съдържа някаква стойност, която може да бъде променена по време на програмата. Казано по-просто, променливата е символ, който представлява количество.
Показалец е променлива, която съдържа адреса на паметта на друга променлива. Указателят не е нищо друго освен адрес и променлива, която съхранява показалец, се нарича променлива на указателя.
Идеята е да се използват идентификатори (или имена) вместо числови адреси, за да се облекчи тежестта на програмирането, като по този начин се намали сложността на програмите. Тъй като тези адреси се отнасят до действителните местоположения в паметта на компютъра, указателите могат да се използват за достъп и манипулиране на съдържание, съхранявано в паметта.
Както всяка променлива или константа, указателите трябва да бъдат декларирани за техните типове. Тъй като указателите съдържат адреси на паметта, които принадлежат към отделен тип данни, те трябва да бъдат декларирани с помощта на указатели, преди да можете да работите с тях. Общата форма на декларация за показалец е:
Data_type * var-name;
Тук „Data_type“ е основният тип на показалеца, а „var-name“ е променливата на показалеца. Звездичката (*) тук се използва за деклариране на показалеца, който обозначава променливата „var-name“ като променлива на показалец.
int * p; // целочислен указател
плава * х; // плаващ указател
Тук променливата "p" сочи към цяло число тип данни, което е декларирано като "int", което се отнася до типа данни на променливата. По подобен начин във втория пример "float" се отнася до типа данни на променливата "x", която всъщност е обозначена като указател към променлива с плаваща запетая.
Референцията е като указател с непряк достъп до променлива. Това е като псевдоним на друга променлива, което означава, че е просто още едно име за вече съществуваща променлива.
Тя позволява на програмистите да създадат второ име на променливата, което могат да използват за манипулиране на съдържанието, съхранявано в тази променлива. Това е субект, който е псевдоним на друга променлива и има същия адрес като оригиналната променлива. Той поддържа преминаване чрез справка, действащо като формални параметри на функцията и след като е дефинирано да се отнася до променлива, тя не може да бъде повторно зададена, което означава, че не може да бъде препратена към друга променлива.
За разлика от указателите, те не се нуждаят от оператор за пренасочване за достъп до стойността; всъщност те могат да се използват като нормални променливи.
int i;
int & ri = i;
Тук "ri" е цяло число, инициализирано с "i". Той декларира „ri“ като обект от тип „препратка към int“. Референцията може лесно да бъде объркана с показалец, който е независима променлива, чиито адресни стойности не могат да бъдат преназначени, след като са създадени.
- И двете предоставят почти сходни възможности по отношение на използваемостта и разграничаването може да бъде сложно. Показалецът е просто променлива, която съхранява адреса на паметта на друга променлива, докато референцията е като псевдоним на вече съществуваща променлива. Той създава второ име за променлива, която може да се използва за промяна на съдържанието, съхранено в тази променлива.
- Показалецът е като всяка друга променлива, която съхранява част от данните. За разлика от други променливи, променливите на показалеца съхраняват адреси на паметта вместо стойности. Показва се показалец, използвайки оператора на индирекцията * за достъп до мястото на паметта на променливата, към която сочи. От друга страна, референцията не се нуждае от оператор за пренасочване за достъп до стойността.
- За разлика от указателите, които могат да се инициализират по всяко време, при инициализация трябва да бъдат зададени препратки. Достъпите могат да бъдат достъпни директно, докато препратките не могат да бъдат директно достъпни.
- Променливата на показалеца има собствено местоположение в паметта, което означава, че когато декларирате указател, посочвате местоположение, което е адрес на памет, присвоен на всяка единица памет. Променливата на показалеца има същия адрес, където е записана в паметта. От друга страна, референтната променлива е псевдоним на друга променлива, като по този начин приема адреса на референтната променлива.
- NULL представлява края на списъка, което означава, че показва, че стойността е неизвестна и тя уточнява, че променливата няма валидно адресно пространство. Стойността на NULL може да бъде присвоена директно на променлива показалец, което предполага, че не сочи никъде, докато NULL не може да бъде присвоена на референтна променлива.
Показалците винаги са били сред любимите теми за обсъждане на програмисти на C / C ++, докато референциите не стигнаха до картината. Позоваванията са донякъде подобни на указателите, но имат сравнителен дял от плюсове и минуси в сравнение. Въпреки че и двете могат да се използват за промяна на локални променливи на една функция в друга функция, те имат своите разлики. И двете са мощни функции в C и C ++, които ви позволяват директно да манипулирате паметта, но с няколко изключения. Показалецът съдържа адреса на паметта на променлива, докато референцията е само псевдоним на друга променлива.