Tömbök és függvények paraméterként

Mutatók funkciók

kettős sin (double x); kettős cos (double x); kettős tan (double x);

Lehet leírni, és egy mutató a funkciót. Például, egy funkció egy érv a kettős típusú, amely értéket ad vissza típusú kettős, a leírása a mutató a következő:

kettős (* fn) (double x);

Itt is, mint abban az esetben a mutató egy tömb zárójelben nagyobb prioritást a művelet *. Ha nem voltak jelen, akkor lehet leírni nem mutató arra a funkcióra, egy függvény, amely visszaadja a mutatót megkétszereződik.

Miután a leírt függvénymutatóval teszi a következő műveleteket:

fn = sin; / * Pointer beállítása függvényében sin * / a = fn (x); / * A funkciót bűn a pointer * / fn = cos; / * Mutató egy funkció cos beállítása * / b = fn (x); / * A funkciót cos a pointer * /

Meg lehet leírni, mint egy sor mutató egy függvény, és inicializálja

Most lehet, hogy a ciklus:

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

Akkor írja le a függvény visszaad egy pointert a funkció:

kettős (* fnFunc (int i)) (double x)

esetben 0. visszatérés sin; 1 eset visszatérő cos; 2. esetben visszatérő tan;

A leírt funkció egy paraméterének int típusú, és visszatér egy mutató funkció egy érv a kettős típusú, értéket ad vissza típusú kettős.

Ismertetése után a funkció lehetővé válik fnFunc ciklus:

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

Tömbök és mutatók

és végzett a hozzárendelési:

pa [0] vagy * pa jelentése [0]; pa [1] vagy a * (pa + 1) jelöli egy [1];

pa [2] vagy a * (pa + 2) jelentése [2], és t. d. Általában, a jelölést az űrlap * (pa + n) és a PA [n] teljesen egyenértékűek. Hasonlóképpen, az megfelelő expressziós * (a + i), és a [i].

Első pillantásra úgy tűnik, hogy a tömb és a mutató teljesen egyenértékű. Van azonban két lényeges különbség a tömb mutató:

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

A pointerek meghatározott növelő és csökkentő műveletek egész értéket, mint egy alternatív formáját a kifejezések

pA = pA + i; egyenértékű pA + = i; pA = pA - i; egyenértékű pA - = i;

pA = pA + 1; egyenértékű pA ++; vagy ++ pA;

pA = pA - 1; egyenértékű pA--; vagy --pA; Ebben az esetben a munka prefix és postfix műveletek ++ és - egybeesik a munkájukat számtani adatokat.

Indexek lehet használni összehasonlítási műveletek. Mindig van lehet összehasonlítani az index nulla és összehasonlítása két mutatóval azonos típusú. Ugyanakkor a helyességét az eredmény a legutóbbi összehasonlítás, mert a 16 bites IBM PC üzemmódban csak akkor garantált, ha

összehasonlítva pointerek mutatókat elemét azonos adatok, vagy ha ki vannak téve az előzetes normalizálás (lásd. alább).

A következő kód használatát szemlélteti a fenti műveleteket,

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

/ * Töltsük a tömb A. működni egy sor * / for (i = 0; i<100; i++) A[i]=0;

/ * Töltsük a tömb A. Working pointer * / for (pA = A, pA100 = pA + 100; pA

Az utóbbi lehetőség lehet kitölteni a tömb hatékonyabb lehet.

Mutatók és kétdimenziós tömbök

Tegyük fel, hogy a következő meghatározást a tömbök és a mutatók:

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

Itt, A jelentése egy kétdimenziós tömböt négy sort és két oszlopot, B - a két-dimenziós tömb elemeinek. Minden ilyen tömbök kell elkülöníteni a megfelelő mennyiségű memória elegendő tárolja az összes azok elemeinek.

adatelemek leírása tömbök csak akkor lesz használva a helyes mutató értéke változik meg, amikor a megengedett számtani műveleteket.

Értelmében ezek a mutatók értelmezése a meghatározott irányba slevanapravo egymást követő műveleteket [], és azt is megváltoztathatja a prioritást működés * zárójelben. Ha nem tesz zárójelben, a következő definíciót

tekinteni, mint a meghatározása a kétdimenziós tömb mutató int típusú.

A fent leírt mutatók érvényesek következő feladat, mivel a bal és a jobb a megbízás egy mutató az azonos típusú adatok:

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

Ez téves, mivel a bal értékadó operátor található int típusú mutató, és jobbra - mutatót az első eleme a tömb egy, amely (elem) egy tömb típusú Int két elem. Ezekben az esetekben a fordító figyelmeztet a gyanús mutató átalakítás.

Ha a programozó bízik a tetteit, akkor használhat egy explicit öntési művelet, hogy megszüntesse ezt a fajta üzenetet, de a fordító nem vállal semmilyen felelősséget a helyességét használatával ez a mutató. Így, miután a feladat

elemek, amelyek által hivatkozott a mutatót, és az elemek a tömb A jelentése következő sor:

p [0] ekvivalens egy [0] [0] p [1] felel meg [0] [1]

p [2] felel meg [1] [0] p [3] felel meg [1] [1] p [4] felel meg [2] [0] p [5] ekvivalens egy [2] [1] p [ 6] egyenértékű a [3] [0] p [7] egyenértékű a [3] [1]

Abszolút helyes hozzárendelését a következők

ami után a használata a tömb és a mutató pAstr teljesen egyenértékű:

pAstr [i] [j] ekvivalens egy [i] [j]

létrehozza a következő levelezés az elemek közötti által hivatkozott pAstr mutató és tömb elemek A:

pAstr [0] [0] ekvivalens egy [2] [0] pAstr [0] [1] felel meg [2] [1] pAstr [1] [0] egyenértékű a [3] [0] pAstr [1] [ 1] egyenértékű a [3] [1]

A következő feladatok helyesek

pA = A; / * Mutató egy kétdimenziós tömb * / pAstr = B; / * Mutató egy egydimenziós tömb * /

és állítsa be a következő sorokat:

(* PA) [i] [j] ekvivalens egy [i] [j] (* pAstr) [i] egyenértékű a B [i]

A tömbök pointerek kényelmes tárolási karakterlánc:

Kapcsolódó cikkek