Óêaçaòåëè ÷aùå âñåãî èñïîëüçóþò ïðè ðaáîòå ñ äèíaìè÷åñêîé ïaìяòüþ, íaçûâaå- ìîé íåêîòîðûìè ýñòåòaìè êó÷åé (ïåðåâîä ñ aíãëèéñêîãî яçûêa ñëîâa heap). Ýòî ñâîáîäíaя ïaìяòü, â êîòîðîé ìîæíî âî âðåìя âûïîëíåíèя ïðîãðaììû âûäåëяòü ìåñòî â ñîîòâåòñòâèè ñ ïîòðåáíîñòяìè. Äîñòóï ê âûäåëåííûì ó÷añòêaì äèíaìè-
÷åñêîé ïaìяòè, íaçûâaåìûì äèíaìè÷åñnèìè ïåðåìåííûìè, ïðîèçâîäèòñя òîëüêî
÷åðåç óêaçaòåëè. Âðåìя æèçíè äèíaìè÷åñêèõ ïåðåìåííûõ — îò òî÷êè ñîçäaíèя äî êîíöa ïðîãðaììû èëè äî яâíîãî îñâîáîæäåíèя ïaìяòè.  C++ èñïîëüçóåòñя äâa ñïîñîáa ðaáîòû ñ äèíaìè÷åñêîé ïaìяòüþ. Ïåðâûé èñïîëüçóåò ñåìåéñòâî ôóíêöèé malloC è äîñòaëñя â íañëåäñòâî îò C, âòîðîé èñïîëüçóåò îïåðaöèè new è delete.
Ïðè îïðåäåëåíèè óê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.
Cóùåñòâóþò ñëåäóþùèå ñïîñîáû èíèöèaëèçaöèè óêaçaòåëя:
Ïðèñâaèâaíèå óêaçaòåëþ aäðåña ñóùåñòâóþùåãî îáúåêòa:
ñ ïîìîùüþ îïåðaöèè ïîëó÷åíèя aäðåña:
inta= 5; // öåëaя ïåðåìåííaя
int* p = &a; // â óêaçaòåëü çaïèñûâaåòñя aäðåñ a int* p (&a); // òî æå ñaìîå äðóãèì ñïîñîáîì
ñ ïîìîùüþ çía÷åíèя äðóãîãî èíèöèaëèçèðîâaííîãî óêaçaòåëя:
int*r= p;
ñ ïîìîùüþ èìåíè ìaññèâa èëè ôóíêöèè, êîòîðûå òðaêòóþòñя êaê aäðåñ (ñì.
«Ìaññèâû», ñ. 58, è «Ïåðåäa÷a èìåí ôóíêöèé â êa÷åñòâå ïaðaìåòðîâ», ñ. 80):
int b[10]; // ìaññèâ
int*t= b; // ïðèñâaèâaíèå aäðåña ía÷aëa ìaññèâa
…
void f(int a ){ /* … */ } // îïðåäåëåíèå ôóíêöèè void (*pf)(int); // óêaçaòåëü ía ôóíêöèþ
pf = f; // ïðèñâaèâaíèå aäðåña ôóíêöèè
Ïðèñâaèâaíèå ónaçaòåëþ aäðåña îáëañòè ïaìяòè â яâíîì âèäå:
Char* vp = (Char *)0xB8000000;
Çäåñü 0xB8000000 — øåñòíaäöaòåðè÷íaя êîíñòaíòa, (Char *) — îïåðaöèя ïðèâå- äåíèя òèïa: êîíñòaíòa ïðåîáðaçóåòñя ê òèïó «óêaçaòåëü ía Char».
Ïðèñâaèâaíèå ïóñòîãî çía÷åíèя:
int* suxx = NULL; int* rulez = 0;
 ïåðâîé ñòðîêå èñïîëüçóåòñя êîíñòaíòa NULL, îïðåäåëåííaя â íåêîòîðûõ ça- ãîëîâî÷íûõ ôaéëaõ C êaê óêaçaòåëü, ðaâíûé íóëþ. Ðåêîìåíäóåòñя èñïîëüçî- âaòü ïðîñòî 0, òaê êaê ýòî çía÷åíèå òèïa int áóäåò ïð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 ónaçaòåëþ:
int* n = new int; // 1
int* m = new int (10); // 2
int* q = new int [10]; // 3
ñ ïîìîùüþ ôóíêöèè malloC1:
int* u = (int *)malloC(sizeof(int)); // 4
 îïåðaòîðå 1 îïåðaöèя new âûïîëíяåò âûäåëåíèå äîñòaòî÷íîãî äëя ðaçìåùåíèя âåëè÷èíû òèïa int ó÷añòêa äèíaìè÷åñêîé ïaìяòè è çaïèñûâaåò aäðåñ ía÷aëa ýòî- ãî ó÷añòêa â ïåðåìåííóþ n. Ïaìяòü ïîä ñaìó ïåðåìåííóþ n (ðaçìåða, äîñòaòî÷íî- ãî äëя ðaçìåùåíèя óêaçaòåëя) âûäåëяåòñя ía ýòaïå êîìïèëяöèè.
 îïåðaòîðå 2, êðîìå îïèñaííûõ âûøå äåéñòâèé, ïðîèçâîäèòñя èíèöèaëèçaöèя âûäåëåííîé äèíaìè÷åñêîé ïaìяòè çía÷åíèåì 10.
 îïåðaòîðå 3 îïåðaöèя new âûïîëíяåò âûäåëåíèå ïaìяòè ïîä 10 âåëè÷èí òèïa int (ìaññèâa èç 10 ýëåìåíòîâ) è çaïèñûâaåò aäðåñ ía÷aëa ýòîãî ó÷añòêa â ïåðå- ìåííóþ q, êîòîðaя ìîæåò òðaêòîâaòüñя êaê èìя ìaññèâa. ×åðåç èìя ìîæíî îáða- ùaòüñя ê ëþáîìó ýëåìåíòó ìaññèâa. Î ìaññèâaõ ðaññêaçûâaåòñя ía ñ. 58.
Åñëè ïaìяòü âûäåëèòü íå óäaëîñü, ïî ñòaíäaðòó äîëæíî ïîðîæäaòüñя èñêëþ÷å- íèå bad_alloC (îá èñêëþ÷åíèяõ ðaññêaçûâaåòñя â ðaçäåëå «Îáðaáîòêa èñêëþ÷è- òåëüíûõ ñèòóaöèé», ñ. 222, a îá îáðaáîòêå îøèáîê âûäåëåíèя ïaìяòè — ía ñ. 378). Còaðûå âåðñèè êîìïèëяòîðîâ ìîãóò âîçâðaùaòü 0.
 îïåðaòîðå 4 äåëaåòñя òî æå ñaìîå, ÷òî è â îïåðaòîðå 1, íî ñ ïîìîùüþ ôóíêöèè âûäåëåíèя ïaìяòè malloC, óíañëåäîâaííîé èç áèáëèîòåêè C.  ôóíêöèþ ïåðåäa- åòñя îäèí ïaðaìåòð — êîëè÷åñòâî âûäåëяåìîé ïaìяòè â áaéòaõ. Êîíñòðóêöèя (int*) èñïîëüçóåòñя äëя ïðèâåäåíèя òèïa óêaçaòåëя, âîçâðaùaåìîãî ôóíêöèåé, ê òðåáóåìîìó òèïó (î яâíîì ïðåîáðaçîâaíèè òèïîâ ñì. ñ. 231). Åñëè ïaìяòü âûäå- ëèòü íå óäaëîñü, ôóíêöèя âîçâðaùaåò 0.
Îïåðaöèþ new èñïîëüçîâaòü ïðåäïî÷òèòåëüíåå, ÷åì ôóíêöèþ malloC, îñîáåííî ïðè ðaáîòå ñ îáúåêòaìè.
Îñâîáîæäåíèå ïaìяòè, âûäåëåííîé ñ ïîìîùüþ îïåðaöèè new, äîëæíî âûïîë- íяòüñя ñ ïîìîùüþ delete, a ïaìяòè, âûäåëåííîé ôóíêöèåé malloC — ïîñðåäñòâîì
1 Äëя òîãî ÷òîáû èñïîëüçîâaòü malloc, òðåáóåòñя ïîäêëþ÷èòü ê ïðîãðaììå çaãîëîâî÷íûé ôaéë .
ôóíêöèè free. Ïðè ýòîì ïåðåìåííaя-óêaçaòåëü ñîõðaíяåòñя è ìîæåò èíèöèaëè- çèðîâaòüñя ïîâòîðíî. Ïðèâåäåííûå âûøå äèíaìè÷åñêèå ïåðåìåííûå óíè÷òîæa- þòñя ñëåäóþùèì îáðaçîì:
delete n; delete m; delete [] q; free (u);
Åñëè ïaìяòü âûäåëяëañü ñ ïîìîùüþ new[], äëя îñâîáîæäåíèя ïaìяòè íåîáõîäèìî ïðèìåíяòü delete[]. Ð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: |