Plasarea obiectelor în memoria RAM

Aritmetica de pointeri, matrice.

Arrays, un operator de indexare, operații pointer de bază
Exemple practice sunt funcțiile strcpy și strlen
În loc să încheiem






Exerciții utile
Referințe

Plasarea obiectelor în memoria RAM

Cu excepția, alte aritmetică indicatorul de mai sus nu este definit - utilizarea lor va duce la programul de erori de compilare. De exemplu, o eroare de compilator va provoca o încercare de a adăuga două indicii sau compararea indicii pentru diferite tipuri de obiecte, o încercare de scăderea numărului de indicator virgulă mobilă, și așa mai departe. Aceleași operații aritmetice, care sunt aplicabile direcțiile, în cele mai multe cazuri au sens doar în contextul matrice (din acest motiv, aritmetica de indicatori și de matrice sunt de obicei considerate simultan).

Arrays, un operator de indexare, operații pointer de bază

O matrice este o colecție ordonată (colecție) a aceluiași tip de obiecte, plasată într-un singur bloc de memorie în serie unul după altul. Același tip de obiecte care fac parte din matrice sunt numite elemente de matrice. Fiecare element al matricei corespunde numărului de index. Indexarea elementelor începe de la zero. primul (primul) element al matricei are indexul 0, următorul (al doilea) element este indicele 1 urmând cel de al doilea (al treilea) - indicele 2, etc. Ultimul element al matricei elementelor k are indicele k-1.

Plasarea obiectelor în memoria RAM

Fig. 1. O serie de elemente k

Mai exact, principiile de lucru cu matrice și operațiunile de bază ale indicatorilor vor fi luate în considerare în exemplul următor.

Arrays, precum și orice alte tipuri de obiecte, pot fi plasate atât în ​​stivă, cât și în memoria dinamică. În primul rând, să examinăm plasarea matricelor pe stivă. Codul primei linii a funcției principale face următoarele:

În conformitate cu operatorul de indexare semantica, aici se mută la obiectul vec matrice cu indexul 2, iar obiectul rezultat i se atribuie o valoare nouă - un număr 103 (Figura 6.) permise pentru această celulă de memorie obiect este scris.








Fig. 7. Un pointer la un element dintr-o serie de obiecte k

Dacă punctele p la un obiect care nu este un element de matrice, rezultatul adăugării cu p întreg nu este definit (și eroare de compilare astfel plus nu rezultă - apare o eroare în timpul execuției programului).

În cazul nostru, vec este un pointer la elementul inițial al matricei, prin urmare, atunci când se calculează expresia vec + 2, ar trebui să obținem un pointer la cel de-al doilea după elementul inițial, adică celui de-al treilea element al matricei. În condițiile ipotezelor noastre privind localizarea obiectelor în memorie, avem:

vec + 2 = vec + 2 * sizeof (scurt) = 0xF838 + 2 * 2 = 0xF838 + 4 = 0xF83C.

Dacă imprimați valorile elementului matricei cu indexul 2 și obiectul indicat de vec + 2:

Fragmentele de cod de mai sus sunt, de asemenea, exemple de cazuri în care nu contează care operator de creștere, prefix sau postfix, este utilizat pentru a crește valoarea variabilei. În aceste fragmente, operatorul de incrementare este necesar doar pentru a mări valoarea indexului i. valoarea returnată direct la ele nu este utilizată.

Poate că, în timp ce expresia (* p ++ = * s ++) la prima vedere pare de neînțeles, dar acest post este util, în practică, se găsește un astfel de cod. Importanța înțelegerii sale este faptul că am analizat exemplul discutat în cartea Bjarne Stroustrup «C ++ Limbajul de programare“ [1] și Brian Kernighan și Dennis Ritchie «C Limbajul de programare“ [2]. În plus, importanța cunoașterii aspectelor legate de punerea în aplicare a funcției strcpy pot fi găsite în cărțile lui Joel Spolsky lui „Joel pe programare,“ [6] și „Joel: și din nou despre programare“ [10].

Pentru a încheia această secțiune, să luăm în considerare funcționarea scăderii unui indicator de la altul. Folosind această operație, în special, este implementată funcția de calcul al lungimii strânse a bibliotecii standard C / C ++.

În loc să încheiem

O parte semnificativă a erorilor în lucrul cu memoria este asociată cu scurgerea acesteia, adică fără eliberarea sau eliberarea incorectă a memoriei dinamice atribuite anterior. În special, o greșeală obișnuită este ștergerea unei game de obiecte folosind operatorul de ștergere în loc de operatorul de ștergere []. Astfel de operatori de substituție nu pot apărea atunci când ștergerea o serie de tipuri de obiecte built-in, dar distrugerea o serie de obiecte complexe, cum ar fi o serie de șiruri (obiecte de tip std :: string), utilizați operatorul delete va duce la ceea ce va fi șters numai prima linie, iar restul va rămâne în memorie. Pentru a detecta astfel de erori, au fost create unelte speciale, dintre care unul a fost discutat în prima parte a articolului.

Astfel, lucrul cu memorie necesită o atenție deosebită și o precizie, manipularea incorectă a acestuia conduce la o dificultate destul de dificil de a detecta erorile și pierderi semnificative de timp în dezvoltarea de software.

Exerciții utile

  1. Introduceți două tablouri întregi pe tastatură, formați și afișați a treia matrice, care se obține prin introducerea tuturor elementelor celei de-a doua cadre după elementul specificat al primei.
  2. Introduceți două linii de la tastatură, formați și afișați a treia linie, care este concatenarea introducerii.

Referințe







Articole similare

Trimiteți-le prietenilor: