2025(e)ko martxoaren 21(a), ostirala

12. jarduera (I) | Erakusleak eta helbideak


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:

  1. Funtzio batek balio bat baino gehiago itzuli behar duenean
  2. Array bat funtzio batera pasatu nahi denean
  3. Array bat aldatu nahi denean arrayaren elementu baten helbidea erabiliz
  4. ...

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:


  • 12a-Jarduera_Erakusleak.cbp | main.c


 

iruzkinik ez:

Argitaratu iruzkina