Указатели
Êîãäa êîìïèëяòîð îáðaáaòûâaåò îïåðaòîð îïðåäåëåíèя ïåðåìåííîé, íaïðèìåð, int i=10;, îí âûäåëяåò ïaìяòü â ñîîòâåòñòâèè ñ òèïîì (int) è èíèöèaëèçèðóåò åå óêaçaííûì çía÷åíèåì (10). Âñå îáðaùåíèя â ïðîãðaììå ê ïåðåìåííîé ïî åå èìå- íè (i) çaìåíяþòñя êîìïèëяòîðîì ía aäðåñ îáëañòè ïaìяòè, â êîòîðîé õðaíèòñя çía÷åíèå ïåðåìåííîé. Ïðîãðaììèñò ìîæåò îïðåäåëèòü ñîáñòâåííûå ïåðåìåííûå äëя õðaíåíèя aäðåñîâ îáëañòåé ïaìяòè. Òaêèå ïåðåìåííûå íaçûâaþòñя óêaçaòå- ëяìè.
Èòaê, ónaçaòåëè ïðåäíaçía÷åíû äëя õðaíåíèя aäðåñîâ îáëañòåñ ïaìяòè.  C++ ðaçëè÷aþò òðè âèäa óêaçaòåëåé — óêaçaòåëè ía îáúåêò, ía ôóíêöèþ è ía void, îò- ëè÷aþùèåñя ñâîéñòâaìè è íaáîðîì äîïóñòèìûõ îïåðaöèé. Óêaçaòåëü íå яâëяåò- ñя ñaìîñòîяòåëüíûì òèïîì, îí âñåãäa ñâяçaí ñ êaêèì-ëèáî äðóãèì êîíêðåòíûì òèïîì.
Óêaçaòåëü ía ôóíêöèþ ñîäåðæèò aäðåñ â ñåãìåíòå êîäa, ïî êîòîðîìó ðañïîëaãa- åòñя èñïîëíяåìûé êîä ôóíêöèè, òî åñòü aäðåñ, ïî êîòîðîìó ïåðåäaåòñя óïðaâëå- íèå ïðè âûçîâå ôóíêöèè. Óêaçaòåëè ía ôóíêöèè èñïîëüçóþòñя äëя êîñâåííîãî âûçîâa ôóíêöèè (íå ÷åðåç åå èìя, a ÷åðåç îáðaùåíèå ê ïåðåìåííîé, õðaíяùåé åå aäðåñ), a òaêæå äëя ïåðåäa÷è èìåíè ôóíêöèè â äðóãóþ ôóíêöèþ â êa÷åñòâå ïaða- ìåòða. Ónaçaòåëü ôóínöèè èìååò òèï «óêaçaòåëü ôóíêöèè, âîçâðaùaþùåé çía÷å- íèå çaäaííîãî òèïa è èìåþùåé aðãóìåíòû çaäaííîãî òèïa»:
òèï (*èìя) ( ñïèñîê_òèïîâ_aðãóìåíòîâ );
Íaïðèìåð, îáúяâëåíèå:
int (*fun) (double, double);
çaäaåò óêaçaòåëü ñ èìåíåì fun ía ôóíêöèþ, âîçâðaùaþùóþ çía÷åíèå òèïa int è èìåþùóþ äâa aðãóìåíòa òèïa double.
Óêaçaòåëü ía îáúåêò ñîäåðæèò aäðåñ îáëañòè ïaìяòè, â êîòîðîé õðaíяòñя äaííûå îïðåäåëåííîãî òèïa (îñíîâíîãî èëè ñîñòaâíîãî). Ïðîñòåéøåå îáúяâëåíèå ónaça- òåëя ía îáúånò (â äaëüíåéøåì íaçûâaåìîãî ïðîñòî óêaçaòåëåì) èìååò âèä:
òèï *èìя;
ãäå òèï ìîæåò áûòü ëþáûì, êðîìå ññûëêè (î ññûëêaõ ðaññêaçûâaåòñя ía ñ. 58) è áèòîâîãî ïîëя (ñì. ñ. 69), ïðè÷åì òèï ìîæåò áûòü ê ýòîìó ìîìåíòó òîëüêî îáúяâ- ëåí, íî åùå íå îïðåäåëåí (ñëåäîâaòåëüíî, â ñòðóêòóðå, íaïðèìåð, ìîæåò ïðèñóò- ñòâîâaòü óêaçaòåëü ía ñòðóêòóðó òîãî æå òèïa).
Çâåçäî÷na îòíîñèòñя íåïîñðåäñòâåííî n èìåíè, ïîýòîìó äëя òîãî, ÷òîáû îáúяâèòü íåñêîëüêî óêaçaòåëåé, òðåáóåòñя ñòaâèòü åå ïåðåä èìåíåì êaæäîãî èç íèõ. Ía- ïðèìåð, â îïåðaòîðå
int *a, b, *c;
îïèñûâaþòñя äâa óêaçaòåëя ía öåëîå ñ èìåíaìè a è c, a òaêæå öåëaя ïåðåìåííaя b.
Ðaçìåð óêaçaòåëя çaâèñèò îò ìîäåëè ïaìяòè. Ìîæíî îïðåäåëèòü óêaçaòåëü ía óêaçaòåëü è ò. ä.
Ónaçaòåëü ía void ïðèìåíяåòñя â òåõ ñëó÷aяõ, êîãäa êîíêðåòíûé òèï îáúåêòa, aä- ðåñ êîòîðîãî òðåáóåòñя õðaíèòü, íå îïðåäåëåí (íaïðèìåð, åñëè â îäíîé è òîé æå ïåðåìåííîé â ðaçíûå ìîìåíòû âðåìåíè òðåáóåòñя õðaíèòü aäðåña îáúåêòîâ ðaç- ëè÷íûõ òèïîâ).
Óêaçaòåëþ ía void ìîæíî ïðèñâîèòü çía÷åíèå óêaçaòåëя ëþáîãî òèïa, a òaêæå ñðaâíèâaòü åãî ñ ëþáûìè óêaçaòåëяìè, íî ïåðåä âûïîëíåíèåì êaêèõ-ëèáî äåéñò- âèé ñ îáëañòüþ ïaìяòè, ía êîòîðóþ îí ññûëaåòñя, òðåáóåòñя ïðåîáðaçîâaòü åãî ê êîíêðåòíîìó òèïó яâíûì îáðaçîì (ñì. ñ. 231).
Óêaçaòåëü ìîæåò áûòü êîíñòaíòîé èëè ïåðåìåííîé, a òaêæå óêaçûâaòü ía êîí- ñòaíòó èëè ïåðåìåííóþ. Ðaññìîòðèì ïðèìåðû:
int i; // öåëaя ïåðåìåííaя
const int ci = 1; // öåëaя êîíñòaíòa
int * pi; // óêaçaòåëü ía öåëóþ ïåðåìåííóþ
const int * pci; // óêaçaòåëü ía öåëóþ êîíñòaíòó
int * const cp = &i; // óêaçaòåëü-êîíñòaíòa ía öåëóþ ïåðåìåííóþ const int * const cpc = &ci; // óêaçaòåëü-êîíñòaíòa ía öåëóþ êîíñòaíòó
Êaê âèäíî èç ïðèìåðîâ, ìîäèôèêaòîð Const, íaõîäяùèéñя ìåæäó èìåíåì óêaça- òåëя è çâåçäî÷êîé, îòíîñèòñя ê ñaìîìó óêaçaòåëþ è çaïðåùaåò åãî èçìåíåíèå, a Const ñëåâa îò çâåçäî÷êè çaäaåò ïîñòîяíñòâî çía÷åíèя, ía êîòîðîå îí óêaçûâaåò. Äëя èíèöèaëèçaöèè óêaçaòåëåé èñïîëüçîâaía îïåðaöèя ïîëó÷åíèя aäðåña &.
Âåëè÷èíû òèïa óêaçaòåëü ïîä÷èíяþòñя îáùèì ïðaâèëaì îïðåäåëåíèя îáëañòè äåéñòâèя, âèäèìîñòè è âðåìåíè æèçíè.
Do'stlaringiz bilan baham: |