Borland C/C++ mintapéldák mutatókra
1. példa #include <stdio.h> void main() { int x,y, *px; // X értéke 2 lesz x = 2; // PX felveszi X címét px = &x; // Y felveszi a PX által mutatott címen lévô // értéket. Mivel a PX az X-re mutat, X érté- // ke pedig 2,ezért az Y értéke is 2 lesz ! y = *px; // Kiiratjuk X,Y értékét a PX által mutatott // cím értékét, ill. annak tartalmát ! printf("\nX=%d Y=%d PX=%p *PX=%d",x,y,px,*px); // Látható hogy PX hossza 4 byte ! }
2. példa // Egy long integer alsó és felsô 2 byte-jának felcserélése #include <stdio.h> void main() { long x; int segit , *y; printf("\nX erteke : ") ; scanf("%ld",&x); // Az Y az X címét veszi fel ugyan, de a cím // típusa az (int *) típusmódosítás miatt nem 4 // byte-ra mutató cím lesz, hanem 2 byte-ra // mutató cím. y = (int *) &x ; // Végeredményben az Y az X "alsó" 2 byte-jára // mutat. *Y nem más mint ennek a 2 byte-nak az // értéke.
printf("Y tartalma = %d\n",. y); printf("Y tartalma = %d\n",*y); // Az Y+1 az X "felsô" 2 byte-jára mutat. *(Y+1) // nem más mint ennek a 2 byte-nak az értéke. printf("Y+1 tartalma = %d\n",*(y+1)); // Most kezdôdik a csere : A SEGIT felveszi X alsó // két byte-jának értékét; segit = *y ; // Az X alsó két byte-ja felveszi a felsô 2 byte // értékét *y = *(y+1) ; // Az X felsô 2 byte-ja felveszi SEGIT értékét, // azaz az alsó 2 byet értékét. *(y+1) = segit ; // ---- A csere befejezôdött printf("X értéke forditva = %ld \n",x); }
3. példa /* ======= Változó hosszúságú integer vektorok ========== */ /* ======= kezelése pointertömb segítségével ========== */ #include <stdio.h> int *pvek[5]; int v0[3] = { 1, 2, 3 }; int v1[5] = { 4, 5, 6, 7, 8 }; int v2[2] = { 9,10 }; int v3[4] = { 11,12,13,14 }; int v4[6] = { 15,16,17,18,19,20 }; int lv[5] = { 3, 5, 2, 4, 6 }; // A vektorok hosszai
void main() { int i, j; // Elhelyezzük a vektorok címeit a pointervektor // megfelelô elemeiben. pvek[0]=v0 ; pvek[1]=v1 ; pvek[2]=v2 ; pvek[3]=v3 ; pvek[4]=v4 ; printf("\nPVEK[2][1] -> V2[1]) = %d\n\n",pvek[2][1]); printf("\nV1[1] = *++PVEK[1] = %d",*++pvek[1]); printf("\nV3[2] = *(PVEK[3]+2) = %d",*(pvek[3]+2)); printf("\nV4[5] = *(PVEK[4]+5) = %d",*(pvek[4]+5)); // A pvek[1] címet az eredetire kell állítani ! pvek[1] = v1 ; for( i=0; i<5; printf("\n"),i++ ) for( j=0; j<lv[i]; printf(" %2d",*(pvek[i]+j++) )); }
4. példa include <stdio.h> char *month_name(int); void main() { int h; printf("\nKérem a hónap sorszámát : ") ; scanf("%d",&h); printf("\nA hónap neve : %s", month_name(h)); }
char *month_name( n ) /*Visszaadja az n-edik hónap nevét*/ int n; { static char *name[] = { "nem létezô hónap", "január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december" }; return( (n<1 || n>12) ? name[0] : name[n] ); }
5. példa /* Példa függvényre mutató pointer használatára */ #include <stdio.h> #include <conio.h> // A getch() függvény miatt #include <math.h> // Az sqrt() függvény miatt void main() { int v, x, y, z ; // A func egy olyan függvényre mutató pointer, // amely float-ot ad vissza, és három darab int // típusú bemenô paramétere van ! float (*func)( int, int, int ); // A három függvény más más mûveletet végez, // ugyanazokon az adatokon. float osszeg( int, int, int ); float atlag( int, int, int ); float gyok( int , int, int ); float w;
x = y = z = 2; // Választás menübôl clrscr(); printf("\n 1. Összeg képzése \n"); printf("\n 2. Átlag képzése \n"); printf("\n 3. Négyzetösszeg gyöke \n"); printf("\n"); printf("\nMelyiket a három közül: ") ; scanf("%d",&v); switch(v) { case 1: func = osszeg ; break; case 2: func = atlag ; break; case 3: func = gyok ; break; default: break; } w = func(x,y,z); printf("\nEredmény = %5.2f",w); getch(); } // A három függvény megvalósítása float osszeg( int o1, int o2, int o3 ) { return( (float) (o1+o2+o3) ); } float atlag( int a1, int a2, int a3 ) { return( (a1+a2+a3) / 3.0 ); } float gyok( int g1, int g2, int g3 ) { double gy; gy = sqrt( (double) (g1*g1 + g2*g2 + g3*g3) ); return( (float) gy ); }