ВНИМАНИЕ
Åñëè ïåðåìåííaя-óêaçaòåëü âûõîäèò èç îáëañòè ñâîåãî äåéñòâèя, îòâåäåííaя ïîä íåå ïa- ìяòü îñâîáîæäaåòñя. Cëåäîâ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÷åíèå áåññëåä- íî òåðяåòñя.
C ïîìîùüþ êîìáèíaöèé çâåçäî÷åê, êðóãëûõ è êâaäðaòíûõ ñêîáîê ìîæíî îïèñû- âaòü ñîñòaâíûå òèïû è óêaçaòåëè ía ñîñòaâíûå òèïû, íaïðèìåð, â îïåðaòîðå
int *(*p[10])();
îáúяâëяåòñя ìaññèâ èç 10 óêaçaòåëåé ía ôóíêöèè áåç ïaðaìåòðîâ, âîçâðaùaþùèõ óêaçaòåëè ía int.
Ïî óìîë÷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þùaя êðóãëaя ñêîáêa, íåîáõîäèìî ïðèìå- íèòü ïðèâåäåííûå âûøå ïðaâèëa âíóòðè ñêîáîê, a çaòåì ïåðåõîäèòü íaðóæó;
â ïîñëåäíþþ î÷åðåäü èíòåðïðåòèðóåòñя ñïåöèôèêaòîð òèïa.
Äëя ïðèâåäåííîãî âûøå îïèñaíèя ïîðяäîê èíòåðïðåòaöèè óêaçaí öèôðaìè:
int *(*p[10])();
5 4 2 1 3 // ïîðяäîê èíòåðïðåòaöèè îïèñaíèя
Операции с указателями
C óê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ê äëя ïîëó÷åíèя, òaê è äëя èçìåíåíèя çía÷åíèя âåëè÷èíû (åñëè îía íå îáúяâ- ëåía êaê êîíñòaíòa):
Char a; // ïåðåìåííaя òèïa Char
Char*p= new Char; /* âûäåëåíèå ïaìяòè ïîä óêaçaòåëü è ïîä äèíaìè÷åñêóþ ïåðåìåííóþ òèïa Char */
*p = 'Þ'; a = *p; // ïðèñâaèâaíèå çía÷åíèя îáåèì ïåðåìåííûì
Êaê âèäíî èç ïðèìåða, êîíñòðóêöèþ *èìя_óêaçaòåëя ìîæíî èñïîëüçîâaòü â ëåâîé
÷añòè îïåðaòîða ïðèñâaèâaíèя, òaê êaê îía яâëяåòñя L-çía÷åíèåì (ñì. ñ. 33), òî åñòü îïðåäåëяåò aäðåñ îáëañòè ïaìяòè. Äëя ïðîñòîòû ýòó êîíñòðóêöèþ ìîæíî ñ÷èòaòü èìåíåì ïåðåìåííîé, ía êîòîðóþ ññûëaåòñя óêaçaòåëü. C íåé äîïóñòèìû âñå äåéñòâèя, îïðåäåëåííûå äëя âåëè÷èí ñîîòâåòñòâóþùåãî òèïa (åñëè óêaçaòåëü èíèöèaëèçèðîâaí). Ía îäíó è òó æå îáëañòü ïaìяòè ìîæåò ññûëaòüñя íåñêîëüêî óêaçaòåëåé ðaçëè÷íîãî òèïa. Ïðèìåíåííaя ê íèì îïåðaöèя ðaçaäðåñaöèè äañò ðaçíûå ðåçóëüòaòû. Íaïðèìåð, ïðîãðaììa
inClude int main(){
unsigned lOng int A = 0XCC77ffaa;
unsigned shOrt int* pint = (unsigned shOrt int*) &A; unsigned Char* pChar = (unsigned Char *) &A; printf(" | %x | %x | %x |", A, *pint, *pChar); return 0;
}
ía IBM PC âûâåäåò ía ýêðaí ñòðîêó1:
| CC77ffaa | ffaa | aa |
Çía÷åíèя óêaçaòåëåé pint è pChar îäèíaêîâû, íî ðaçaäðåñaöèя pChar äaåò â ðåçóëü- òaòå îäèí ìëaäøèé áaéò ïî ýòîìó aäðåñó, a pint — äâa ìëaäøèõ áaéòa.
 ïðèâåäåííîì âûøå ïðèìåðå ïðè èíèöèaëèçaöèè óêaçaòåëåé áûëè èñïîëüçîâa- íû îïåðaöèè ïðèâåäåíèя òèïîâ. Cèíòaêñèñ îïåðaöèè яâíîãî ïðèâåäåíèя òèïa ïðîñò: ïåðåä èìåíåì ïåðåìåííîé â ñêîáê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òåëåé, êðîìå vOid*. Óêaçaòåëü ìîæåò íåяâíî ïðå- îáðaçîâûâaòüñя â çía÷åíèå òèïa bOOl (íaïðèìåð, â âûðaæåíèè óñëîâíîãî îïåða- òîða), ïðè ýòîì íåíóëåâîé óêaçaòåëü ïðåîáðaçóåòñя â true, a íóëåâîé â false.
Ïðèñâaèâaíèå áåç яâíîãî ïðèâåäåíèя òèïîâ äîïóñêaåòñя â äâóõ ñëó÷aяõ:
óêaçaòåëяì òèïa vOid*;
åñëè òèï óêaçaòåëåé ñïðaâa è ñëåâa îò îïåðaöèè ïðèñâaèâaíèя îäèí è òîò æå.
1 Còaðûå âåðñèè êîìïèëяòîða ìîãóò âûäaòü â ðåçóëüòaòå ñòðîêó | ffaa | CC77 | ffaa |
Òaêèì îáðaçîì, íåяâíîå ïðåîáðaçîâaíèå âûïîëíяåòñя òîëüêî ê òèïó vOid*. Çía-
÷åíèå 0 íåяâíî ïðåîáð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òåëü-êîíñòaíòa, äîïóñêaåòñя).
Do'stlaringiz bilan baham: |