Ìíîãîìåðíè
ìàñèâè
Âúçìîæíî å äà áúäàò äåôèíèðàíè è ìíîãîìåðíè ìàñèâè. Âñÿêà
ðàçìåðíîñò ñå îïðåäåëÿ ÷ðåç ñîáñòâåíà äâîéêà îò ñêîáè. Íàïðèìåð,
èçðàçúò
int ia[ 4 ][ 3 ];
äåôèíèðà äâóìåðåí ìàñèâ. Ïúðâàòà
ðàçìåðíîñò ñå îòíàñÿ çà ðåäîâå, à âòîðàòà - çà êîëîíè. Ò.å. ia å äâóìåðåí ìàñèâ,
ïðèòåæàâàù ÷åòèðè êîëîíè ñ ïî òðè åëåìåíòà. Äâóìåðíèòå ìàñèâè îáèêíîâåíî ñå
íàðè÷àò ìàòðèöè.
Ìíîãîìåðíèòå ìàñèâè ìîãàò ñúùî äà áúäàò
èíèöèàëèçèðàíè.
int ia[ 4 ][ 3 ] ={ { 0, 1, 2 }, { 3, 4, 5 },
{ 6, 7,
8 }, { 9, 10, 11 } }
Âúòðåøíèòå ñêîáè, óêàçâàùè ðàçäåëÿíåòî ïî ðåäîâå, íå
ñà çàäúëæèòåëíè. Ñëåäíàòà èíèöèàëèçàöèÿ å åêâèâàëåíòíà íà ïðåäõîäíàòà, âúïðåêè
÷å íå å òîëêîâà ÿñíà.
int ia[4][3] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11
};
×ðåç äåôèíèöèÿòà, êîÿòî ñëåäâà, ñå èíèöèàëèçèðàò ïúðâèòå åëåìåíòè íà
âñåêè ðåä. Îñòàíàëèòå åëåìåíòè ïîëó÷àâàò ñòîéíîñò íóëà.
int ia[4][3] = {
{0}, {3}, {6}, {9} };
Êîãàòî âúòðåøíèòå ñêîáè ëèïñâàò ðåçóëòàòúò ùå áúäå
ñúâñåì ðàçëè÷åí. Ñúñ ñëåäíàòà äåôèíèöèÿ
int ia[4][3] = { 0, 1, 2, 3
};
ñå èíèöèàëèçèðàò ïúðâèòå òðè åëåìåíòà íà ïúðâèÿ ðåä è ïúðâèÿ åëåìåíò
íà âòîðèÿ. Îñòàíàëèòå åëåìåíòè ïîëó÷àâàò ñòîéíîñò 0. Çà äà ñå èíäåêñèðàò
ìíîãîìåðíè ìàñèâè ñå èçïîëçóâàò äâîéêè ñêîáè çà âñÿêà ðàçìåðíîñò. Íàïðèìåð,
ñëåäíàòà äâîéêà îò äâà âëîæåíè öèêúëà for èíèöèàëèçèðà äâóìåðåí
ìàñèâ.
main() {
const rowSize = 4;
const colSize = 3;
int ia[
rowSize ][ colSize ];
for ( int i = 0; i < rowSize; ++i )
for ( int j =
0; j < colSize; ++j )
ia[ i ][ j ] = i + j;
}
 ïðîãðàìíèòå
åçèöè Ïàñêàë èëè Àäà, ìíîãîìåðíèòå ìàñèâè ñå èíäåêñèðàò, êàòî ñå èçïîëçóâà
ñïèñúê îò ñòîéíîñòè, ðàçäåëåíè ñúñ çàïåòàÿ, êîéòî å çàòâîðåí â åäíà äâîéêà îò
ñêîáè. Âúïðåêè ÷å èçðàçúò
ia[ 1, 2 ]
ïðåäñòàâÿ åäíà ñèíòàêòè÷íî
ïðàâèëíà êîíñòðóêöèÿ êàêòî â Ñ++, òàêà è â Àäà, çíà÷åíèåòî ìó å ñúâñåì ðàçëè÷íî
â äâàòà åçèêà.
-  Àäà ÷ðåç òîçè èíäåêñ ñå óêàçâà âòîðèÿ åëåìåíò íà
ïúðâèÿ ðåä. Ñòîéíîñòòà ìó å öÿëàòà âåëè÷èíà íà òîçè åëåìåíò.
- Â Ñ++ èçðàçúò
óêàçâà òðåòèÿ ðåä íà ia (äà ñè ïðèïîìíèì, ÷å ðåäîâåòå è êîëîíèòå ñå èíäåêñèðàò,
êàòî ñå çàïî÷âà îò 0). Ñòîéíîñòòà ìó å óêàçàòåë êúì òèï int*, àäðåñèðàù íóëåâèÿ
åëåìåíò íà òîçè ðåä.
 Ñ++ èíäåêñíèÿ èçðàç îò ïðèìåðà
ia[ 1, 2
]
ñå ðàçãëåæäà èçðàç çà ïîñëåäîâàòåëíî èçïúëíåíèå, êîéòî âðúùà öÿëà
ñòîéíîñò - â òîçè ñëó÷àé:
ia[ 2 ]
Èçðàçúò çà ïîñëåäîâàòåëíî
èçïúëíåíèå ïðåäñòàâëÿâà ñåðèÿ îò èçðàçè, ðàçäåëåíè ñúñ çàïåòàÿ. Òîçè èçðàç ñå
èç÷èñëÿâà îò ëÿâî íà äÿñíî. Ðåçóëòàòúò ìó å ñòîéíîñòòà íà íàé-äåñíèÿ èçðàç.
Íàïðèìåð, ñòîéíîñòòà íà ñëåäíèÿ èçðàç çà ïîñëåäîâàòåëíî èçïúëíåíèå å
3.
7, 6+4, ia[0][0] = 0, 4-1; // comma expression
Âðúçêà ìåæäó
òèïîâåòå ìàñèâ è óêàçàòåë
Äåôèíèöèÿòà íà åäèí ìàñèâ ñå ñúñòîè îò ÷åòèðè
ðàçëè÷íè åëåìåíòà: ñïåöèôèêàòîð íà òèï, èäåíòèôèêàòîð, èíäåêñåí îïåðàòîð (“[]”)
è îçíà÷åíèå íà ðàçìåðíîñòòà. Íàïðèìåð,
char buf[ 8 ];
äåôèíèðà buf
êàòî ìàñèâ îò 8 åëåìåíòà îò òèï char. Ïîäîïèñàíèå, îñúùåñòâåíî ÷ðåç ïðèëàãíå íà
èíäåêñíèÿ îïåðàòîð êúì èäåíòèôèêàòîðà íà ìàñèâà, îò âèäà
buf[ 0
];
âðúùà ñòîéíîñòòà íà ïúðâèÿ åëåìåíò, êîéòî ñå ñúäúðæà â buf. Êàêâî,
îáà÷å, ñå ñëó÷âà, êîãàòî áúäå ïðîïóñíàò èíäåêñíèÿ îïåðàòîð? Êàêâà å ñòîéíîñòòà
íà ñàìèÿ èäåíòèôêàòîð íà ìàñèâ?
buff;
Èäåíòèôèêàòîðúò íà ìàñèâà
ïðåäñòàâÿ àäðåñà íà ïúðâèÿ åëåìåíò, êîéòî ñå ñúäúðæà â buf. Òîâà å åêâèâàëåíòíî
íà
&buf[ 0 ];
Äà ñè ïðèïîìíèì, ÷å ïðèëàãàíåòî íà àäðåñíèÿò
îïåðàòîð êúì äàííîâ îáåêò âðúùà óêàçàòåë îò òèïà íà îáåêòà.  òîçè ñëó÷àé,
îáåêòúò å îò òèï char, êîåòî îçíà÷àâà, ÷å buf òðÿáâà äà âðúùà ñòîéíîñò îò òèï
char*. Àêî òîâà å òàêà, òî åäèí óêàçàòåë áè ìîãúë äà áúäå è èäåíòèôèêàòîð íà
ìàñèâ. Íàïðèìåð,
char *pBuf = buff; // ok
pbuf è buf ñåãà âå÷å ñà
åêâèâàëåíòíè. Âñè÷êè èç÷èñëåíèÿ ñå èçâúðøâàò ñïðÿìî ïúðâèÿ åëåìåíò íà ìàñèâà. Çà
äà áúäå àäðåñèðàí ñëåäâàùèÿ åëåìåíò, ñëåäîâàòåëíî, ìîãàò äà ñå ïðèëîæàò ñëåäíèòå
äâà ìåòîäà, êîèòî ñúùî òðÿáâà äà áúäàò åêâèâàëåíòíè:
// equivalent
addressing methods
pBuff + 1;
&buf[ 1 ];
È èçîáùî
for (
int i = 0; i < arraySize; ++i )
{ pBuf + 1;
&buf[ i ]; }
Îò
òîâà ñëåäâà, ÷å ôîðìèòå
// two equivalent accessing
methods
*pbuf;
buff[ 0 ];
ñà åêâèâàëåíòíè. Âñåêè îò òÿõ âðúùà
ñòîéíîñòòà íà íóëåâèÿ åëåìåíò íà ìàñèâà. Çà äà ïîëó÷è äîñòúï äî ñëåäâàùèÿ
åëåìåíò ïðîãðàìèñòúò òðÿáâà äà èçïîëçóâà åäèí îò ñëåäíèòå äâà íà÷èíà:
*(
pBuff + 1 );
buf[ 1 ];
èëè ïî-îáùî êàçàíî,
*( pBuff + index
);
buf[ index ];
Òåçè äâà ìåòîäà çà àäðeñèðàíå íà åëåìåíòè íà ìàñèâ
ìîãàò äà áúäàò èçïîëçóâàíè ðàâíîñòîéíî. Ïðîãðàìèñòèòå, êîèòî ñåãà ñå çàïîçíàâàò
ñúñ Ñ++ ÷åñòî òðóäíî áîðàâÿò ñ óêàçàòåëíèÿ ñèíòàêñèñ.  íà÷àëîòî òå ìîæå äà
èñêàò äà ïðèëàãàò èíäåêñíèÿ îïåðàòîð êúì óêàçàòåëè, êîéòî àäðåñèðàò ìàñèâè.
Ñëåäâàùàòà ðåàëèçàöèÿ íà ôóíêöèÿ, êîÿòî ñëåïâà äâà íèçà, å åäèí òàêúâ
ïðèìåð.
#include <stream.h>
char *catString( char *st1, char
*st2 ) {
// append st2 to st1 if two distinct strings
// if st1 does
not address a string
// but st2 does, return st2
if ( st1 == 0
&& st2 )
return st2;
// unless st1 and st2 address
distinct
// strings, returns st1
if ( st2 == 0 || st1 == st2
)
return st1;
for ( int i = 0; st1[ i ] != ‘�’; ++i ) ;
// stpe
through to end of st1
for ( int j = 0; st2[ j ] !=; ++i, ++j )
st[ i ]
= st[ j ];
st2[ i ] = ‘�’;
return st1;
}
Åêâèâàëåíòíîñòòà íà
óêàçàòåëè è ìàñèâè òðÿáâà äà ñå ðàçáèðà â ñìèñúë íà äîñòúï èëè àäðåñèðàíå íà
áëîêîâå îò ïàìåòòà. Ìåòîäúò, ïî êîéòî, îáà÷å, èäåíòèôèêàòîðúò íà ìàñèâ è
óêàçàòåëÿò àäðåñèðàò ïàìåòòà å ñúùåñòâåíî ðàçëè÷åí.
Âñÿêà äåôèíèöèÿ íà
ìàñèâ ïðåäèçâèêâà îòäåëÿíå íà áëîê îò ïàìåò. Èäåíòèôèêàòîðúò íà ìàñèâà ñå
èíèöèàëèçèðà ñ òîçè àäðåñ, êàòî òîé íå ìîæå äà áúäå ïðîìåíÿí âúâ âúòðåøíîñòòà íà
ïðîãðàìàòà. Íà ïðàêòèêà èäåíòèôèêàòîðà íà ìàñèâà ñå îáðàáîòâà êàòî êîíñòàíòà.
Ñëåäîâàòåëíî, îïèòúò äà áúäå óâåëè÷åí buf â ñëåäâàùàòà ïðîãðàìà å íåêîðåêòåí.
Èäåíòèôèêàòîðúò íà ìàñèâ íå å ñòîéíîñò çà çàïèñ.
char buf[] =
"rampion";
main() {
int cnt = 0;
while ( *buf ) { ++cnt;
++buf; //
error: may not increment buff
} }
Äåôèíèöèÿòà íà óêàçàòåë ïðåäëàãà
ñàìî âúçìîæíîñò äà ñå ñúõðàíÿâà ñòîéíîñò íà àäðåñ îò ïàìåòòà. Ïðîãðàìèñòúò
òðÿáâà äà äàäå íà óêàçàòåëÿ ñòîéíîñò, ïðåäñòàâëÿâàùà àäðåñ íà âå÷å ðàçïîëîæåí â
ïàìåòòà îáåêò èëè íà ÷àñò îò òàêúâ, ïðåäè äà ìîæå äà áúäå èçïîëçâàí ñïîêîéíî.
Òîâà îòäåëÿíå íà ïàìåò ÷åñòî ñå ïðàâè è ïî âðåìå íà èçïúëíåíèå íà ïðîãðàìàòà
êàòî ñå èçïîëçóâà îïåðàòîðà new. (Âæ. ðàçäåë 5.1 çà ïîâå÷å
èíôîðìàöèÿ).
Óïðàæíåíèå 1-13. Âúïðåêè ÷å ñëåäíàòà ïðîãðàìà ñå êîìïèëèðà
áåç ïðåäóïðåæäåíèÿ èëè ñúîáùåíèÿ çà ãðåøêè, â íåÿ èìà íåùî íåïðàâèëíî. Êúäå å
ïðîáëåìà? Êàê ùå ãî îòêðèåòå?
char buf[] = "fiddleferns";
main()
{
char *ptr = 0;
for ( int i = 0; buf[ i ] != ‘�’; ++i;)
ptr[ i ] =
buf[ i ];
}