Enrere Mòdul 5
Fonaments de Programació. Llenguatge C/C++---
Pràctica    Resum teòric Exercicis
Pràctica d'ampliació

 

Primer contacte amb els punters.

En aquesta primera pràctica aprendrem a declarar un punter, assignar-li l'adreça d'una variable i entendre els operadors & i *.

 

Desenvolupament de la pràctica

Abans de tot, creeu una nova carpeta per aquest tercer mòdul amb el nom Mòdul_5. Aneu afegint nous arxius per cada nova pràctica o exercici amb els noms que cada vegada es proposi.

Creeu un nou arxiu del tipus C++ anomenat m5p01.cc i escriviu el següent codi:

// m5p01.cc - Primer contacte amb els punters -

#include <iostream>

#include <stdlib.h>


using namespace std;

int main(){

   int i,j, *ptr_enter; // declaració de variables

   system("clear");

   cout<<"L'adreça de la variable entera i "<<"és: "<<&i<<endl;
   cout<<"L'adreça de la variable entera j "<<"és: "<<&j<<endl;
   cout<<"L'adreça del punter ptr_enter "<<"és: "<<&ptr_enter
   <<endl;

   i = 10;

   cout<<"L'adreça de i "<<"és "<<&i<<" i té per contingut "
   <<i<<endl;

   ptr_enter = &i; //li posem l'adreça de i al punter ptr_enter

   cout<<"L'adreça del punter és "<<&ptr_enter
   <<" i el seu contingut és "<<ptr_enter<<endl;
   cout<<"El punter apunta a la variable i de valor "
   <<*ptr_enter<<endl;

   j=*ptr_enter; /* li donem el valor de la variable a la que
   apunta el punter ptr_enter*/

   cout<<"L'adreça de la variable j és "<<&j
   << " i el seu valor és "<<j<<endl;

   return 0;
}

 

Captura de l'execució del programa.

Explicació del programa

Si executem el programa, la sortida serà semblant a la següent (el valor de les adreces poden canviar d'una execució a una altra):

L'adreça de la variable entera i és: 0x0065FDF4
L'adreça de la variable entera j és: 0x0065FDF0
L'adreça del punter ptr_enter és: 0x0065FDEC

L'adreça de i és 0x0065FDF4 i té per contingut 10
L'adreça del punter és 0x0065FDEC i el seu contingut és 0x0065FDF4
El punter apunta a la variable i de valor 10

L'adreça de la variable j és 0x0065FDF0 i el seu valor és 10

El primer que hem d'observar en el programa anterior és la línia:

using namespace std;

És necessària ja que les declaracions que permeten l’accés a cout i cin estan en una llibreria externa.

La declaració:

int i,j, *ptr_enter; // declaració de variables 

En aquesta línia es declaren simultàniament tres variables, dues variables enteres i, i j i una variable punter a enter anomenada ptr_enter.

En les següents línies s'ordena que surti per pantalla les adreces de les tres variables,

cout<<"L'adreça de la variable entera i és: "<<&i<<endl;
cout<<"L'adreça de la variable entera j és: "<<&j<<endl; 
cout<<"L'adreça del punter ptr_enter és: "
        <<&ptr_enter<<endl;
L'adreça de la variable entera i és: 0x0065FDF4
L'adreça de la variable entera j és: 0x0065FDF0
L'adreça del punter ptr_enter és: 0x0065FDEC

Per defecte, les adreces surten en format hexagesimal.

Fixeu-vos que l'ordre per emmagatzemar aquestes variables és l'ordre invers d'escriptura en la línia i que totes tres ocupen 4 octets de memòria (de fet, només es pot comprovar aquesta circumstància amb les variables *ptr_enter i j ).

A continuació s'assigna el valor 10 a la variable i. Amb la següent sentència de sortida es pot comprendre la diferència entre &i i i. Mentre que i mostra el valor de la variable, &i mostra l'adreça on està emmagatzemada la variable i.

i = 10;

cout<<"L'adreça de i és "<<&i<<" i té per contingut "
         <<i<<endl;

L'adreça de i és 0x0065FDF4 i té per contingut 10

La següent línia és una assignació d'un valor a la variable punter. Evidentment, aquest valor és una adreça de memòria, l'adreça de la variable i:

ptr_enter = &i; //posem l'adreça de i al punter ptr_enter 

Les següents sentències mostren la diferència entre el valor del punter i la seva adreça:

cout<<"L'adreça del punter és "<<&ptr_enter
    <<" i el seu contingut és "<<ptr_enter<<endl;
cout<<"El punter apunta a la variable i de valor "
    <<*ptr_enter<<endl;
L'adreça del punter és 0x0065FDEC i el seu contingut és 0x0065FDF4
El punter apunta a la variable i de valor 10

Totes dues coses són adreces. Es pot comprovar que el contingut de la variable ptr_enter coincideix amb l'adreça de la variable i mostrada anteriorment. També es pot comprovar el significat de l'operador d'indirecció * que mostra el valor 10, és a dir, el valor de la variable apuntada pel punter. 

Per últim, hi ha una sentència on s'assigna el valor de la variable apuntada pel punter (10) a la variable j. La sentència de sortida següent permet comprovar que l'adreça de la variable j no ha canviat i sí el seu valor que ara val 10. 

j=*ptr_enter; /* li donem el valor de la variable a la que                       apunta el punter ptr_enter*/    

cout<<"L'adreça de la variable j és "<<&j
    << " i el seu valor és "<<j<<endl;

L'adreça de la variable j és 0x0065FDF0 i el seu valor és 10