Indicatori c

Indicatori c

Colectarea de informații pentru a scrie acest articol, mi-am amintit prima mea întâlnire cu indicii - tristețe, durerea a fost ... Deci, după ce a citit câteva capitole pe tema diferitelor cărți despre programare în C ++, sa decis să meargă un mod diferit și de a prezenta subiectul C ++ pointerii în secvență, în care consider că este necesar. Vă vom da imediat o scurtă definiție și vom lua în considerare indicii din lucrare - prin exemple. În următorul articol (Pointerii C ++. Partea 2) vor fi prezentate nuanțe cu linii folosesc indicii în stil C (Tablourile de caractere) și sol, care ar trebui să fie amintit.

După examinarea următoarelor exemple, veți înțelege principalul lucru - de ce avem nevoie de indicii în programare, de a le declara și de a le aplica.

Să spunem că în program trebuie să creăm o matrice întregă a cărei dimensiune exactă nu ne este cunoscută înainte de începerea programului. Adică, nu știm câte numere va trebui să facă un utilizator în această matrice. Desigur, putem acoperi și proclama o serie de câteva mii de elemente (de exemplu, la 5.000). Acest lucru (în opinia noastră subiectivă) ar trebui să fie suficient pentru ca utilizatorul să lucreze. Da - într-adevăr - acest lucru poate fi suficient. Dar să nu uităm că această matrice va ocupa o mulțime de RAM (5 000 * 4 (tip int) = 20 000 octeți). Am asigurat apoi și utilizatorul va umple doar 10 elemente din matricea noastră. Se pare că de fapt 40 de octeți sunt în uz și 19 960 de octeți își pierd memoria.

utilizarea nerezonabilă a RAM-ului

Standard sizeof funcția de bibliotecă () trimite un anunț arrWithDigits matrice linia 10. Se va reveni la locul de apel în octeți, care ocupă matrice în memorie. Întrebarea „? Câte numere pe care le introduceți în matrice“ Răspunsul este - 10. În linia 15, suma * sizeof (int) expresie ar fi echivalentă cu 10 * 4, în funcție de sizeof (int) returnează 4 (dimensiunea unui octeti int). Apoi, introduceți numerele de la tastatură și programul le va afișa pe ecran. Se pare că restul de 4990 elemente vor stoca zerouri. Deci nu are rost să le arătăm.

Indicatori c

Indicatori c
Aici, operatorul >> este evidențiat cu roșu >> deoarece modificarea valorii constante este imposibilă.

Indicatori c
Aici suntem avertizați că dimensiunea matricei nu poate fi valoarea unei variabile obișnuite. Aveți nevoie de o valoare constantă!

În următorul cod, vom folosi indicatorul și noii operatori noi (alocă memoria) și ștergeți (eliberează memoria).

utilizarea rațională a memoriei RAM folosind indicii

folosind namespace std;

setlocale (LC_ALL; "rus");

int sizeOfArray = 0; // dimensiunea matricei (utilizatorul va intra)

cout <<"Чтобы создать массив чисел, введите его размер: " ;

cin >> sizeOfArray;

// în zona de memorie pentru a aloca noi

int * arrWithDigits = int int [sizeOfArray];

pentru (int i = 0; i

Astfel, în linia 16, a fost definită o matrice dinamică. Acest lucru înseamnă că memoria din cadrul acestuia va fi alocată (sau nu alocată) în timp ce programul se execută, și nu la timpul de compilare, așa cum se întâmplă cu matricea obișnuită. Adică alocarea memoriei depinde de evoluția programului și de deciziile luate direct în activitatea sa. În cazul nostru, depinde de ce intră utilizatorul în variabila sizeOfArray

Linia 25 utilizează operatorul de ștergere. Eliberă memoria alocată de noul operator. Având în vedere că noua memorie este alocată pentru plasarea de matrice, apoi eliberați-l atunci când este necesar pentru a face clar pentru compilator pe care trebuie să elibereze memoria matrice, și nu doar celula zero, a subliniat arrWithDigits. Prin urmare, între numele și șterge indicatorul pune paranteze pătrate [] - șterge [] arrWithDigits; Amintiți-vă că de fiecare dată când memoria este alocată cu noi. Este necesar să eliberați această memorie utilizând ștergerea. Desigur, la terminarea programului, memoria ocupată de acesta va fi eliberată automat. Dar permiteți-vă să utilizați operatorii noi și să ștergeți operatorii într-o pereche. La urma urmei, programul poate găzdui 5-6 matrice, de exemplu. Și dacă vă va elibera memoria de fiecare dată când nu mai este necesară în viitor, în cadrul programului de funcționare - memorie va fi cheltuit mai înțelept.

Să presupunem că în programul nostru am completat matricea cu zece valori. Apoi și-au numărat suma și le-au scris într-o anumită variabilă. Și totul - nu vom mai lucra cu această matrice. Programul își continuă activitatea și creează noi rețele dinamice pentru anumite scopuri. În acest caz, este recomandabil să eliberați memoria care ocupă primul array. Apoi, atunci când se alocă memoria la reelele rămase, această memorie poate fi reutilizată în program.

Luați în considerare utilizarea indicatorilor ca parametri ai funcțiilor. Mai întâi, tastați și compilați următorul cod. În ea, funcția primește două variabile și propune modificarea valorilor lor.

încercați să modificați variabilele transmise funcției

Indicatori c

Totul sa dovedit - valorile variabilelor au fost schimbate în funcție.

Nu vă faceți griji dacă ceva nu este clar. Ai o mulțime de informații noi în această lecție - și este normal că nu totul a fost imediat perceput. Înțelegerea indicatorilor va veni cu practica. Vom vorbi mai multe despre indicii în a doua parte a acestui articol și vom rezolva problemele. Deci, totul va fi bine.

Parametrii (argumente) de funcții:

Olej.

Declarație foarte îndoielnică!
O matrice declarată local (într-o funcție) este plasată pe stivă și este șters atunci când funcția este terminată. Acest lucru este deosebit de eficient după rezolvarea rețelelor cu limite dinamice de către standardul C ++ 11.
Și folosirea matricelor alocate dinamic, cu anumite avantaje, are și mai multe neajunsuri.

Paradoxul.
Compilatorul "compilator: GNU GCC Compiler" a adoptat următorul cod:

folosind namespace std;

int main ()
setlocale (LC_ALL, "rusă");

int SizeOfArray;
cout <<"Сколько чисел вы введёте в массив? " <> SizeOfArray;
int arrWithDigits [SizeOfArray] = <>;

pentru (int i = 0; i cout < arrWithDigits [i];
>
cout <

pentru (int i = 0; i cout <>
cout < retur 0;
>

Programul în care lucrez Cod: Bloc 16.01.
----- Build: Debug în Zadacha12 (compilator: GNU GCC Compiler) -----

mingw32-g ++ exe -Wall -g -c C :. \ 2 \ codeblocks-16,01 \ Code \ Zadacha12 \ Zadacha12.cpp o- obj \ Debug \ Zadacha12.o
mingw32-g + .exe -o bin \ Debug \ Zadacha12.exe obj \ Debug \ Zadacha12.o
Fișierul de ieșire este bin \ Debug \ Zadacha12.exe cu dimensiunea de 1,01 MB
Procesul a terminat cu starea 0 (0 minute, 0 secunde)
0 erori, 0 avertisment (0 minute, 0 secunde)

Olej.

Paradoxul este ce?
Compilatorul GCC este mult mai avansat decât compilatorul de la Microsoft și este mult mai precis în sintaxa să respecte standardele C ++.