În prima parte, am analizat modul în care folosim pointerul și noul operator, puteți aloca direct o porțiune din memoria dimensiunii cerute în timp ce programul se execută. De asemenea, ați învățat cum poate fi eliberată această zonă de memorie utilizând ștergerea. Am văzut cum parametrii sunt transmiși funcției prin pointer. Și faptul că acest lucru face posibilă modificarea valorii variabilelor care sunt transmise funcției.
Acum ne vom uita la un exemplu în care vom trece indicii la șiruri (caractere) la funcția. Funcția returnează un indicator. Sarcina este următoarea: Există două indicii la liniile sub care sunt alocate zonele de memorie necesare. Este necesar să combinați aceste două linii. Adică este necesar să alocăm o nouă zonă de memorie pentru prima linie, astfel încât să devină posibilă completarea celei de-a doua linii în ea.
alocând o nouă memorie suficientă pentru rând
Mergem în ordine. Linia 4 conține prototipul funcției. Sarcina sa este de a aloca o nouă arie de memorie pentru o linie la sfârșitul căreia se va scrie o altă linie. Acest lucru vom discuta mai jos, când ajungem la definiția acestei funcții. Să mergem la liniile 11-12. Definesc variabilele care vor stoca valorile lungimii liniilor "linia 1" și "+ linia 2". Lungimea este calculată utilizând funcția built-in strlen (). Returnează valoarea lungimii șirului fără a ține seama de simbolul \ 0. Prin urmare, atunci când inițializăm variabilele strSize1 și strSize2, adăugăm la cea care returnează o unitate strlen (...).
Desigur - deoarece memoria alocată primei linii este prea mică, pentru a adăuga la ea mai multe date. În linia 28, scriem în variabila necesarăSimți o dimensiune de memorie cu adevărat necesară pentru scrierea a două linii: int requiredSize = (strSize1 + strSize2) - 1; Unitatea este luată pentru că două \ 0 sunt deja incluse în variabilele strSize1 și strSize2 și avem nevoie doar de una.Creați un indicator nou și alocați imediat o memorie suficientă pentru a plasa caracterele ambelor linii (pagina 44). Apoi, copiați caracterele primei linii în memoria alocată: strcpy_s (strInFunc.reqSize.pstr1); Șirul este copiat - trebuie să eliberați memoria pe care o ocupă, astfel încât să nu existe nicio scurgere de memorie (pagina 48). Întoarcere din funcția un pointer la o nouă locație de memorie: return strInFunc;
Acest exemplu a arătat cum, folosind indicii, putem gestiona memoria RAM într-un octet.
În cele din urmă, rezumăm și indicăm principalul lucru pe care trebuie să-l amintiți despre indicii.
De ce am nevoie de indicii în C ++?
Să luăm în considerare în detaliu un exemplu:
Linia 25 prezintă un exemplu de accesare a elementelor de date dintr-o matrice printr-un pointer. Este folosită notația array. Adică nu este nevoie să folosim operația de dereferențiere pentru a accesa datele de matrice:
cout <<"pfirstArr[0] = " < Poți, desigur, să accesezi datele dintr-un tablou folosind notația pointerului, dar acest lucru este incomod. Uitați-vă cum ar arăta atribuirea de valori elementelor de matrice și afișarea valorilor pe ecran: Liniile 27-28 ale codului sursă - definiția șirului C și definiția unui pointer la această linie. Indicatorii sunt remarcabil de buni la lucrul cu siruri de caractere. Când suntem în fluxul cout se referă la un pointer la o matrice de caractere, acesta ne va arăta întregul șir. La fel ca în cazul matricelor, compilatorul va scoate caracterele pe ecran până când găsește un caracter de sfârșit de linie în matricea \ 0 Uită-te din nou la rezultatul programului și la codul sursă. Încercați să înțelegeți cum funcționează.
O altă abatere de la subiect, pentru a-i înveseli pe cei cărora li se dă greu tema indicilor :) Nu sunteți singuri. Totul vine cu practica! Și va veni la tine! Nu vă faceți panică dacă pare prea confuză pentru dvs. Rezolvați cât mai multe sarcini de programare posibil. Chiar dacă faceți ceva greșit în procesul de scriere a codului, minunatele noastre medii de dezvoltare vă vor informa.
Indicatorii ca parametri (argumente) de funcții:
Nu pot să înțeleg. în linia 15 a codului - strcpy_s (pStr1, strSize1, "linia 1");
în funcția strcpy_s sunt folosite 3 argumente, mai devreme în descrierea acestei funcții, a fost specificat doar 2 argumente (unde să copiați și ce să copiați).
De fapt, întrebarea. de ce există acum 3 argumente în ea? Pentru că folosim acum pointerul ca primul argument? Sau pentru că aceasta este o nouă versiune a acestei funcții (strcpy_s în loc de strcpy)? Sau este această caracteristică a studioului vizual? pentru că în cod. funcțiile blocurilor strcpy ia 2 argumente <>.
Exemplul de cod folosește funcția strcpy_s (), nu strcpy (), care are de fapt 2 argumente. Vedeți numele cu atenție.
P.S. Acest lucru nu înseamnă că trebuie să faceți acest lucru: strcpy_s () este o funcție care nu aparține standardelor POSIX, C, Linux etc. și altele asemenea. ... și este folosit numai în sistemele de operare Windows (nu veți găsi chiar descrierile sale în literatura de specialitate). Dar exemplul concret este corect.
Am înțeles doar că descrierile lui strcpy_s pe care nu o voi găsi, dar de ce această funcție trebuie să știe dimensiunea șirului nu este clară.
Trebuie să cunoașteți dimensiunea șirului, deoarece primul argument este un indicator? Sau este o caracteristică a funcției reînnoite? Și câte argumente acceptă această funcție (poate să o ia)?
Specificarea mărimii liniei care este copiată este foarte utilă: dacă șirul sursă, din întâmplare, este mai lung decât receptorul, veți obține o eroare de acces la memorie cu prăbușirea întregii aplicații.
Uită-te la descrierea bibliotecii și a funcției standard strncpy (), care este mai sigur și mai des folosit în codul profesional decât strcpy ().