Array și funcții ca parametri

Indicatori de funcționare

păcatul dublu (dublu x); cos dublu (dublu x); dublu bronz (dublu x);

De asemenea, puteți descrie un indicator la o funcție. De exemplu, pentru o funcție cu un argument de tipul double, returnând o valoare de tip dublu, descrierea unui astfel de indicator va arăta astfel:







dublu (* fn) (dublu x);

Aici, ca și în cazul unui pointer de matrice, parantezele măresc prioritatea operației *. Dacă nu erau prezente, s-ar descrie funcția care returnează valoarea indicelui la dublu.

După ce este descris indicatorul funcției, devin posibile următoarele operații:

fn = sin; / * Setați cursorul la funcția sin * / a = fn (x); / * Apelarea funcției păcat prin pointer * / fn = cos; / * Setarea cursorului la cos * / b = fn (x); / * Apelarea funcției cos prin pointer * /

Puteți descrie o serie de pointeri la o funcție și puteți inițializa

Acum devine posibil următorul ciclu:

printf ("F (x) =% lf \ n", fnArray [i] (x));

Puteți descrie o funcție care returnează o valoare a indicatorului unei funcții:

dublu (* fnFunc (int i)) (dublu x)

cazul 0. return sin; caz 1. return cos; cazul 2. întoarcere tan;

Funcția descrisă are un parametru de tip int și returnează valoarea unui pointer la o funcție cu un argument de tipul double, care returnează o valoare dublă de tip.

După ce funcția fnFunc este descrisă, se poate realiza următoarea buclă:

printf ("F (x) =% lf \ n", fnFunc (i) (x));

Arrays și pointeri

iar cesiunea a fost făcută:

pa [0] sau * pa va însemna un [0]; pa [1] sau * (pa + 1) va denumi un [1];

pa [2] sau * (pa + 2) va însemna un [2], ș.amd În general, notația formulei * (pa + n) și pa [n] este complet echivalentă. În mod echivalent, expresiile * (a + i) și a [i] sunt echivalente.

La prima vedere, se pare că matricea și indicatorul sunt complet echivalente. Cu toate acestea, există două diferențe semnificative între matrice și pointer:

int A [20], * pA = A; dublu B [20], * pB = B;

Pentru pointeri sunt definite operațiile de creștere și descreștere cu o valoare intregă, ca formă alternativă de scriere a expresiilor

pA = pA + i; este echivalent cu pA + = i; pA = pA-i; este echivalent cu pA - = i;

pA = pA + 1; este echivalent cu pA ++; sau ++ pA;

pA = pA-1; este echivalent cu pA-; sau - pA; În acest caz, lucrarea operațiilor prefix și postfix ++ și - coincide cu activitatea lor pentru datele aritmetice.

Pointerii pot fi utilizați în operații de comparație. Este întotdeauna posibil să comparați pointerul cu zero și să comparați două dintre aceleași indicii. Cu toate acestea, corectitudinea rezultatului ultimei comparații pentru modul de operare pe 16 biți al PC-ului IBM este garantată numai dacă







indicatorii comparați sunt indicatori ai elementelor din același set de date sau dacă sunt anterior supuși normalizării (a se vedea mai jos).

Următorul fragment al programului ilustrează utilizarea operațiunilor de mai sus

dublu A [100], * pA, * pA100; int i;

/ * Completați matricea A. Lucrăm cu matricea * / pentru (i = 0; i<100; i++) A[i]=0;

/ * Umpleți matricea A. Lucrăm cu indicatori * / pentru (pA = A, pA100 = pA + 100; pA

Ultima opțiune de umplere a unei matrice poate fi mai eficientă.

Pointeri și matrice bidimensionale

Să avem următoarele definiții ale matricelor și indicilor:

int * p, (* pA) [4] [2], (* pAstr) [2];

Aici A este o matrice bidimensională de patru rânduri și două coloane, B este o matrice unidimensională de două elemente. Pentru fiecare dintre aceste matrice, este alocată o cantitate adecvată de memorie, suficientă pentru a stoca toate elementele lor.

elementele de date din descrierea matricelor vor fi utilizate numai pentru a modifica corect valoarea indicelui când se execută operații aritmetice admisibile peste acesta.

Semnificația interpretării acestor indicii este determinată de direcția dreptului de succesiune a următoarelor operații [] și, de asemenea, prin schimbarea precedenței operației * cu ajutorul parantezelor. Dacă nu puneți paranteze, atunci următoarea definiție

este considerată ca fiind definiția unei serii bidimensionale de indicatori pentru a tasta int.

Pentru indicatorii de mai sus, sunt permise următoarele operații de atribuire, deoarece operațiile de asignare din stânga și din dreapta sunt indicatoare pentru același tip de date:

p = A [0] [0]; p = A [2];

este incorect, deoarece la stânga operației de atribuire există un pointer pentru a tasta int, iar în partea dreaptă este un pointer la primul element al matricei A, care (element) este o matrice de două elemente de tip int. În astfel de cazuri, compilatorii emite un mesaj de avertizare cu privire la transformarea suspectă a indicatorului.

Dacă programatorul este încrezător în acțiunile sale, atunci poate folosi operația explicită de distribuire pentru a elimina acest mesaj, dar compilatorul nu își asumă nicio responsabilitate pentru utilizarea corectă a unui astfel de indicator. Deci, după alocare

elementele menționate de pointer și elementele matricei A sunt în următoarea corespondență:

p [0] este echivalent cu A [0] [0] p [1] este echivalent cu A [0] [1]

p [3] este echivalent cu A [1] [0] p [3] este echivalent cu A [1] [1] 6] este echivalent cu A [3] [0] p [7] este echivalent cu A [3] [1]

Următoarele alocări sunt corecte

după care folosirea matricei A și a pointerului pAstr sunt complet echivalente:

pAstr [i] [j] este echivalent cu A [i] [j]

stabilește următoarea corespondență între elementele la care se face referire prin pointerul pAstr și elementele matricei A:

pAstr [0] [0] este echivalent cu A [2] [1] pAstr [1] [0] 1] este echivalent cu A [3] [1]

Următoarele alocări sunt corecte

pA = A; / * Pointer la o matrice bidimensională * / pAstr = B; / * Pointer la o matrice unidimensională * /

și să stabilească următoarea corespondență a elementelor:

(pA) [i] [j] este echivalent cu A [i] [j] (* pAstr) [i]

Arrays of pointers sunt convenabile pentru stocarea șirurilor de caractere:







Articole similare

Trimiteți-le prietenilor: