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 un nou espai de treball per aquest mòdul amb el nom: m5. Aneu afegint un projecte nou del tipus Win32 Console Application per cada nova pràctica o exercici amb els noms que cada vegada es proposi.

Definiu un projecte nou anomenat m5p01 i afegiu-li un arxiu de font C/C++ anomenat m5p01.cpp. Escriviu el següent codi:

 

// m5p01.cpp: Primer contacte amb els punters

#include <iostream.h>

void main(){

     int i,j, *ptr_enter; // declaració de 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;

     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;

}

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 de 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