Arrays, Corzi, Pointeri

2. Arrayuri, șiruri de caractere, indicatoare.

O matrice este un ansamblu de mai multe variabile de același tip. O matrice cu numele a de elemente LENGTH de tip TYPE este declarată după cum urmează:







Aceasta corespunde faptului că sunt declarate variabile de tip TYPE cu nume speciale a [0], a [1]. a [LENGTH -1]. Fiecare element al matricei are propriul număr de index. Accesul la cel de-al x-lea element al matricei se face folosind operația de indexare:

Orice expresie care returnează un întreg de tip char poate fi folosită ca un index. scurt. int. mult timp. Indicii matrice începe cu 0 Cu (nu 1) și indicele ultimului element al elementelor de matrice LENGTH - l LUNGIME -1 (nu LUNGIME). Prin urmare, bucla este peste toate elementele matricei

indx

Analizele statice pot fi declarate cu inițializare. enumerând valorile elementelor lor în <> separate de o virgulă. Dacă sunt specificate mai puține elemente decât lungimea matricei, elementele rămase sunt considerate zerouri:

Dacă nu specificați dimensiunea matricei cu inițializare, aceasta va fi calculată de compilator:

Pointerului i se poate atribui valoarea unui alt pointer la același tip. Ca rezultat, ambii pointeri vor indica același loc din memorie: ptr1 = ptr;

Putem schimba variabila care va fi specificată cu *

În acest caz, vom înregistra și apoi citim valoarea array-ului variabil [x], la care este plasat pointerul, adică,

Operația * explică semnificația TIPULUI * ptr; înseamnă că valoarea expresiei * ptr va fi de tip TYPE. Numele tipului de pointer în sine este (TYPE *). În special, TYPE poate fi el însuși un tip de index - poți declara un pointer la un pointer, ca char ** ptrptr;

Această relație între indicatori și matrice ne permite să aplicăm operația * la numele matricei: value = * array; înseamnă același lucru ca valoarea = array [0];

Rețineți că pointerul poate fi trimis în locul greșit - într-o secțiune de memorie care conține date de tipul greșit, care este specificată în descrierea indicatorului; sau care conțin, în general, un necunoscut care:

Atribuirea unui indicator la o valoare incorectă nu este încă o eroare. Eroarea va apărea numai când accesați datele pentru acest pointer (astfel de erori sunt greu de căutat!).

sizeof (arr [0]) returnează dimensiunea unui element. Și toate acestea nu depind de tipul elementului (pur și simplu deoarece toate elementele matricei au aceeași dimensiune).

Cu ajutorul unor tablouri de octeți, puteți utiliza următoarea construcție, care specifică tablouri (șiruri de caractere) de aceeași mărime: În această secțiune vom lua în considerare, în principal, șiruri și indicatori pentru simboluri.

Cum sunt inițializate matricele externe și statice în mod implicit? Setările automate sunt inițializate în mod implicit? Cum pot atribui valori elementelor unui matrice care aparțin oricărei clase de memorie?







Fie matricea int arr [10]; ce înseamnă atunci expresiile:

Creșterea valorii indicate de indicatorul a este corectă? pe unitate? Răspunsul: nu, este necesar:

Fragmentul de text este: Ce sunt egale (Răspuns: 'x', '\ 0', 'd')

Este posibil să scrieți un ++. Același lucru despre b ++. Este posibil să scrie b = a. a = b. (nu, da, da, nu)

Mai jos este un program care calculează valoarea medie a elementelor de matrice. Rescrieți programul specificat folosind indicii.

Ce va fi tipărit ca rezultat al programului?

De ce este arr arr [] descris în afara funcției principale ()? Cum se face în funcția principal ().

Răspuns: scrieți în principal

Este posibil să scrieți în C după cum urmează:

Răspunsul: din păcate, este imposibil (C nu este Algol). Când se alocă memoria pentru o matrice, trebuie specificată o constantă sau o expresie ca dimensiune, care poate fi calculată la timpul de compilare la o constantă întregă, adică Arrays au o lungime fixă.

Efectuarea unui program de matrice de inițializare bidimensională a [10] [10], elementele de probă cu [5] [5] la o [9] [9] și imprimarea acestora. Utilizați accesul la elemente prin pointer.

Asigurați funcția de calcul al produsului scalar al a doi vectori. Lungimea vectorilor este specificată ca unul dintre argumente.

Alcătuiți funcția de multiplicare a matricelor bidimensionale a [] [] * b [] [].

Compuneți funcția de multiplicare a matricelor tridimensionale a [] [] [] * b [] [] [].

Pentru cei care au programat în Pascal. Care este greșeala? Răspuns: matricele multidimensionale în C ar trebui indexate astfel:

În același exemplu, avem expresia x, y (operatorul "virgulă") cu valoarea y. și anume Nu există o eroare de sintaxă, dar sensul a fost complet schimbat!

Miezurile bidimensionale din memorie sunt reprezentate ca fiind unidimensionale. De exemplu, dacă construirea unui [y] [x] devine compilate într-o construcție unidimensională ca aceasta: adică,

Consecința acestui fapt este că compilatorul pentru a genera indexare bidimensională (sau mai multe) trebuie să cunoască M în masă - dimensiunea matrice pentru a doua dimensiune (precum și al treilea, al patrulea, etc.). În particular, funcția de transmisie într-o matrice multidimensională și atunci când descrie matrici exterior: Acesta este modul în care, de exemplu, locul de muncă ar trebui să arate arr matrice bidimensională [RÂDURI] [COLS], retrasă prin malloc ();

Cum să descrieți linkurile (indicii) pe rețelele bidimensionale? Luați în considerare acest program:

Indicatorul este aici ptr. Rețineți că aceasta are o dimensiune în a doua dimensiune: în al doilea rând. tocmai pentru ca compilatorul să calculeze corect indicii bidimensionali.

Încercați să vă declarați

și să vedem ce fel de efecte tristă va duce la aceasta (compilatorul, de altfel, va jura, dar există o posibilitate că o va face pentru dvs., dar va funcționa prost). Încercați și să folosiți ptr [x] [y].

Ce înseamnă descrierea? Variabilele din C sunt descrise în formatul utilizării lor. Astfel, descrierea înseamnă că f poate fi folosit în formă

Cu toate acestea, din această metodă de descriere, tipul variabilei descrise și semnificația ei sunt destul de nevăzute. Iată metoda (împrumutată din jurnalul "Communications of the ACM"), care face posibilă clarificarea semnificației descrierii. Descrierea pe C este tradusă în descriere în stilul lui Algol-68. Mai jos sunt câteva exemple din care metoda de conversie este, de asemenea, clară: că este, f este o funcție care readuce un pointer la o funcție care returnează un întreg. f este o serie de pointeri la funcții care returnează numere întregi. În schimb, descriem
g ca un pointer la o funcție care returnează un pointer la o serie de 5 și pointeri la funcții care returnează indicii la întregi. În C, funcțiile care returnează o matrice sunt imposibile: Numele tipului (de exemplu, pentru utilizarea în operația de distribuție) este obținut ștergând numele variabilei (și, de asemenea, dimensiunea matricei poate fi omisă):

Scrie funcția strcat (d, s) care atribuie șirul s la sfârșitul liniei d.

Răspuns: O buclă marcată cu "strcpy" este cea mai concisă înregistrare a operatorilor. De fapt, strcat ar trebui să returneze primul argument prin standard, precum și funcția strcpy.

Aceste două opțiuni demonstrează că funcția poate fi implementată în mai multe moduri. În plus, se observă că, în locul funcției standard a bibliotecii, putem defini funcția proprie cu același nume, care diferă oarecum de funcția standard (ca valoare de retur în prima versiune).







Articole similare

Trimiteți-le prietenilor: