Avui estic molt content, aquesta nit ha estat la meva primera vegada… d’ús dels punters en C++!
Llegint un llibre que creo que vaig comentar sobre C++, he arribat al capítol dels punters i després d’explicar el que expliquen tots els llibres, (”Els punters no guarden un valor, sinó una adreça de la memòria.”), aquest a diferència d’uns altres ha mostrat casos, més o menys, reals sobre l’ús de punters. Una solució pràctica i molt útil: Com pugues una funció retornar dos valors?
Bueno, aquí us poso aquest petit programa que he fet per a comparar una funció de intercanvio del valor de dues variables (Swap) usant-la per mitjà de punters, per referències i com la habria construït un programador que no sap gens d’això…
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#include
#include //Si no estàs en Windows, pot ser que nu funcione.
/*
Les tres funcions swap fan el mateix, cada una usant un tipus d’argument
diferent: La primera usa dos nombres enters. La segona usa dos punters a
dos enters. La tercera usa dos referències a dos valors enters.
La funció, té com argument dos nombres enters i crea un nombre enter
temporal.
Mostra els valors dels dos arguments abans de l’intercanvi de valors.
Intercanvia els valors entre els arguments.
Mostra els valors després de l’intercanvi de valors dels arguments.
*/
void Swap(int x, int y)
{
int temp;
std::cout < < "n(SWAP) Abans de l'intercanvi -> x: ” < < x << " || y: " << y;
temp = y;
y = x;
x = temp;
std::cout << "n(SWAP) Després de l'intercanvi -> x: ” < < x << " || y: " << y;
}
void pSwap(int * x, int * y)
{
int temp;
std::cout << "n(pSWAP) Abans de l'intercanvi -> *x: ” < < *x << " || *y: " << *y;
temp = *y;
*y = *x;
*x = temp;
std::cout << "n(pSWAP) Després de l'intercanvi -> *x: ” < < *x << " || *y: " << *y;
}
void rSwap(int &x, int &y)
{
int temp;
std::cout << "n(rSWAP) Abans de l'intercanvi -> &x: ” < < x << " || &y: " << y;
temp = y;
y = x;
x = temp;
std::cout << "n(rSWAP) Després de l'intercanvi -> &x: ” < < x << " || &y: " << y;
}
/*
La funció main crea un bucle per a verificar que l'usuari ha sel·leccionat
una de les tres opcions adeqüades.
Es demana que s'introdueixi un valor per a X i un per a Y.
mostra el valor de X i Y abans de cridar qualsevol funció.
Depenent de l'opció elegida en el bucle while, el programa crida a una
funció o a una altra.
Mostra el valor de X i de Y després d'haver cridat una de les funcions.
*/
int main()
{
int x, y, opt = 0;
while (opt < 1 || opt > 3)
{
system(”cls”); //Si no estàs en Windows, pot ser que nu funcione.
std::cout < < "Introdueix l'opció que vols probar: ";
std::cout << "nt1.- Funció 'normal' (SWAP)";
std::cout << "nt2.- Funció per punters (pSWAP)";
std::cout << "nt3.- Funció per referència (rSWAP)";
std::cout << "nnTria una opció correcta: ";
std::cin >> opt;
}
std::cout < < "nIntrodueix un valor per a x: ";
std::cin >> x;
std::cout < < "nIntrodueix un valor per a y: ";
std::cin >> y;
std::cout < < "n(MAIN) Abans de cridar a la funció -> x: ” < < x << " || y: " << y;
switch(opt)
{
case 1: Swap(x, y); break;
case 2: pSwap(&x, &y); break;
case 3: rSwap(x, y); break;
}
std::cout << "n(MAIN) Després de cridar a la funció -> x: ” < < x << " || y: " << y;
return 0;
}
|
Crec que els comentaris ho expliquen tot a la perfecció, però vaig a explicar perquè les dues últimes funcions no fan el mateix que la primera:
En l’exemple es diferencien dos tipus de variables, les locals i les globals.
Les locals són les quals es creen en una funció, i les globals les quals es creen en el programa general.
En el primer exemple, es creen dues variables locals que alberguen un valor sencer i s’assigna al valor d’aquestes variables el valor de les variables globals definides en la línia 55. Per tant, quan estem canviem el valor de x i y dintre de la funció Swap, no estem canviando el valor de x i y globals, sinó locals.
En el cas dels punters, aquests no emmagatzemen un valor, sinó una adreça. Quan vam usar les variables globals com argument de la funció pSwap, els punters locals emmagatzemen la mateixa adreça que els punters globals, per tant, els canvis que fem en els locals s’aplicaran en els globals.
Amb les referències passa més o menys el mateix. Les referències són alies d’un objecte i quan es modifica aquest alies, es modifica l’objecte.
Filed under: Programació |
You can follow any responses to this entry through the RSS 2.0 feed.
You can leave a response, or trackback from your own site.
Related Posts