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. 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:Mutatók és kétdimenziós tömbök
Kapcsolódó cikkek