ZER DAKIDAN: datu-mota desberdineko aldagaiak erabiltzen badakit eta batzuetan memoriako helbideak ikusi ditut ere. ZER IKASIKO DUDAN: Erakusle bat zer den ikasiko dut. |
Erakusle bat zer da?
Erakusle batek aldagai batera sartzeko bide bat ematen du, aldagaiaren identifikadorea erabili gabe. Horretarako, aldagaiaren helbidea erabiltzen da. Beraz, aldagaiaren helbideak bitartekari gisa jokatzen du aldagaiaren eta harekin lan egin behar duen programaren artean.
Hau da, programaren instrukzio batek aldagai bati erreferentzia egin ahal dio zeharka, eta, horretarako, aldagaiaren helbidea erabil dezake.
Zergatik erabiltzen dira erakusleak?
Erakusle bat erabiltzen dira jatorrizko balioa pasatzea zaila edo desegokia den egoeretan. Adibidez:
- Funtzio batek balio bat baino gehiago itzuli behar duenean
- Array bat funtzio batera pasatu nahi denean
- Array bat aldatu nahi denean arrayaren elementu baten helbidea erabiliz
- ...
Konstante-erakuslea eta aldagai-erakuslea
Konstante-erakusle bat memoriako helbide bat da, eta aldagai-erakusle bat memoriako toki bat da helbide bat gordetzeko ahalmena duena. Esate baterako:
float fZbk = -7.09; // zenbakizko aldagai honek eduki bat dauka (-7.09) eta helbide bat &fZbk float *p; // float bati seinalatzen dion erakusle-aldagaiaren deklarazioa, berak ere eduki bat eta helbide bat izango ditu // &fZbk helbide zehatz bat delako konstante-erakusle bat da *p = &fZk; // p helbide bat da, aldagai-erakusleari dagokion helbidea da // *p aldagai-erakuslearen edukia da, -7.09 zenbaki erreala printf("\n %.2f", fZbk); // -7.09 pantailan idatzi (zuzenean) printf("\n %.2f", *p); // -7.09 pantailan idatzi (zeharka)
Hau garrantzitsua da: kontuz * asteriskoarekin
float *p; bitartez erakusle-aldagaia deklaratzean, * asteriskoaren esanahia da: erakusle datu mota (kasu honetan, erreal bati seinalatzen dion erakusla da p). *p = 7.3; bitartez esleipena gauzatzean, * asteriskoaren esanahia da: erakusleak seinalatzen duen aldagaia (kasu honetan, aldagai erreal batean 7.3 gorde). |
![]() |
Irudia handiago ikusteko bere gainean klik egin |
/* 12a-Erakusleak-Helbideak: erakusleak eta helbideak */ // int iZbk; deklarazio ondoren: // - iZbk integer bat, iZbk zenbaki-aldagaiaren edukia // - &iZbk helbide bat, iZbk zenbaki-aldagaiaren helbidea // int *p_iZbk; deklarazio ondoren: // - p_iZbk helbide bat, zenbaki-aldagai bati seinalatzen dion erakusle-aldagaia // - *p_iZbk integer bat, p_iZbk erakusleak seinalatzen duen zenbaki-aldagaiaren edukia // Arrayekin berdin da, baina ahaztu gabe arrayaren helbidea bere identifikadorea dela #include <stdio.h> int main() { int iZbk; // iZbk zenbaki-aldagaiaren deklarazioa int *p_iZbk; // p_iZbk erakusle-aldagaiaren deklarazioa printf("\n Aldagai oso bat eta berari seinalatzen dion erakuslea"); printf("\n -----------------------------------------------------\n"); p_iZbk = &iZbk; // erakuslearen edukia iZbk zenbaki-aldagaiaren helbidea *p_iZbk = 7; // p_iZbk erakusleak seinalatzen duen iZbk zenbaki-aldagaian 7 gorde printf("\n Bi agindu hauek bete ondoren:"); printf("\n p_iZbk = &iZbk; // erakuslearen edukia iZbk-ren helbidea"); printf("\n *p_iZbk = 7; // p_iZbk-k seinalatzen duen aldagaian 7 gorde \n"); printf("\n Edukiak Helbideak"); printf("\n ------- ---------"); printf("\n iZbk = %d &iZbk = %d", iZbk, (int)&iZbk); printf("\n p_iZbk = %d &p_iZbk = %d", (int)p_iZbk, (int)&p_iZbk); printf("\n *p_iZbk = %d p_iZbk = %d = &*p_iZbk (hau ez da erabiltzen)", *p_iZbk, (int)&*p_iZbk); printf("\n\n"); printf("\n Osoen array bat eta berari seinalatzen dion erakuslea"); printf("\n -----------------------------------------------------\n"); int aiKopuruak[] = {3, 5, 7, 9}; // 4 osoen array bat int *p_aiKopuruak; // p_aiKopuruak erakusle-aldagaiaren deklarazioa p_aiKopuruak = aiKopuruak; // arrayaren helbidea bere identifikadorea da printf("\n \t aiKopuruak[] arraya"); printf("\n \t -------------------"); for (int k=0; k < 4; k++) printf("\n \t k=%d \t aiKopuruak[%d]=%d", k, k, aiKopuruak[k]); printf("\n"); printf("\n \t p_aiKopuruak erakuslea"); printf("\n \t ----------------------"); for (int k=0; k < 4; k++) { printf("\n \t k=%d \t *p_aiKopuruak=%d", k, *p_aiKopuruak); p_aiKopuruak++; } printf("\n\n"); return 0; }
Erakusle motako aldagai batek helbideak gordetzen ditu. Ikusi zer gerta daitekeen zenbakizko aldagai baten helbidea gordetzen duen erakuslearekin lan egitean:
|
iruzkinik ez:
Argitaratu iruzkina