Els punteres són una característica poderosa i essencial en molts llenguatges de programació, incloent ALGOL. Permeten als programadors treballar directament amb adreces de memòria, oferint un control més fi sobre l'assignació i la gestió de la memòria. En aquest tema, explorarem els conceptes bàsics dels punteres, com declarar-los, inicialitzar-los i utilitzar-los en ALGOL.
Conceptes Clau
-
Què és un Punter?
- Un punter és una variable que emmagatzema l'adreça de memòria d'una altra variable.
- Els punteres permeten l'accés directe a la memòria, la qual cosa pot millorar l'eficiència del programa.
-
Declaració de Punteres
- Els punteres es declaren especificant el tipus de dades que apunten seguit d'un asterisc (
*
).
- Els punteres es declaren especificant el tipus de dades que apunten seguit d'un asterisc (
-
Inicialització de Punteres
- Els punteres es poden inicialitzar amb l'adreça d'una variable utilitzant l'operador d'adreça (
&
).
- Els punteres es poden inicialitzar amb l'adreça d'una variable utilitzant l'operador d'adreça (
-
Accés a Valors Utilitzant Punteres
- L'operador de desreferència (
*
) s'utilitza per accedir al valor emmagatzemat a l'adreça apuntada pel punter.
- L'operador de desreferència (
Declaració i Inicialització de Punteres
Exemple de Codi
begin integer a; integer *p; a := 10; p := &a; // p ara apunta a l'adreça de memòria de 'a' print("El valor de a és: ", a); print("L'adreça de a és: ", p); print("El valor apuntat per p és: ", *p); end
Explicació del Codi
-
Declaració de Variables:
integer a;
declara una variablea
de tipus enter.integer *p;
declara un punterp
que pot apuntar a una variable de tipus enter.
-
Inicialització:
a := 10;
assigna el valor 10 a la variablea
.p := &a;
assigna l'adreça dea
al punterp
.
-
Accés a Valors:
print("El valor de a és: ", a);
imprimeix el valor dea
.print("L'adreça de a és: ", p);
imprimeix l'adreça dea
(emmagatzemada enp
).print("El valor apuntat per p és: ", *p);
imprimeix el valor emmagatzemat a l'adreça apuntada perp
(és a dir, el valor dea
).
Operacions amb Punteres
Assignació de Valors a través de Punteres
begin integer a; integer *p; p := &a; // p apunta a 'a' *p := 20; // assigna 20 a 'a' a través del punter print("El valor de a és: ", a); // hauria de ser 20 end
Punteres i Arrays
Els punteres són especialment útils quan es treballa amb arrays, ja que permeten iterar i manipular elements de l'array de manera eficient.
begin integer array[5]; integer *p; integer i; for i := 0 step 1 until 4 do array[i] := i * 10; p := &array[0]; // p apunta al primer element de l'array for i := 0 step 1 until 4 do print("Valor de l'array[", i, "] és: ", *(p + i)); end
Explicació del Codi
-
Inicialització de l'Array:
for i := 0 step 1 until 4 do array[i] := i * 10;
inicialitza l'array amb valors 0, 10, 20, 30, 40.
-
Assignació del Punter:
p := &array[0];
assigna l'adreça del primer element de l'array al punterp
.
-
Accés als Elements de l'Array:
for i := 0 step 1 until 4 do print("Valor de l'array[", i, "] és: ", *(p + i));
imprimeix els valors de l'array utilitzant aritmètica de punteres.
Exercicis Pràctics
Exercici 1: Intercanvi de Valors Utilitzant Punteres
Escriu una funció que intercanviï els valors de dues variables utilitzant punteres.
procedure swap(integer *x, integer *y); begin integer temp; temp := *x; *x := *y; *y := temp; end begin integer a, b; a := 5; b := 10; print("Abans de l'intercanvi: a = ", a, ", b = ", b); swap(&a, &b); print("Després de l'intercanvi: a = ", a, ", b = ", b); end
Solució
-
Declaració de la Funció:
procedure swap(integer *x, integer *y);
declara una funcióswap
que pren dos punteres a enters com a paràmetres.
-
Intercanvi de Valors:
temp := *x;
emmagatzema el valor apuntat perx
entemp
.*x := *y;
assigna el valor apuntat pery
a la variable apuntada perx
.*y := temp;
assigna el valor emmagatzemat entemp
a la variable apuntada pery
.
-
Crida a la Funció:
swap(&a, &b);
crida la funcióswap
passant les adreces dea
ib
.
Exercici 2: Inversió d'un Array Utilitzant Punteres
Escriu una funció que inverteixi els elements d'un array utilitzant punteres.
procedure reverseArray(integer *arr, integer size); begin integer *start, *end, temp; start := arr; end := arr + size - 1; while start < end do begin temp := *start; *start := *end; *end := temp; start := start + 1; end := end - 1; end end begin integer array[5]; integer i; for i := 0 step 1 until 4 do array[i] := i + 1; print("Array original: "); for i := 0 step 1 until 4 do print(array[i], " "); reverseArray(&array[0], 5); print("\nArray invertit: "); for i := 0 step 1 until 4 do print(array[i], " "); end
Solució
-
Declaració de la Funció:
procedure reverseArray(integer *arr, integer size);
declara una funcióreverseArray
que pren un punter a un array i la seva mida com a paràmetres.
-
Inicialització de Punteres:
start := arr;
inicialitzastart
amb l'adreça del primer element de l'array.end := arr + size - 1;
inicialitzaend
amb l'adreça de l'últim element de l'array.
-
Inversió de l'Array:
while start < end do
itera mentrestart
sigui menor queend
.temp := *start; *start := *end; *end := temp;
intercanvia els valors apuntats perstart
iend
.start := start + 1; end := end - 1;
mou els punteresstart
iend
cap al centre de l'array.
Conclusió
Els punteres són una eina poderosa en ALGOL que permeten un control detallat sobre la memòria. Hem vist com declarar, inicialitzar i utilitzar punteres, així com algunes operacions bàsiques amb punteres. Els exercicis pràctics proporcionats ajuden a consolidar aquests conceptes i a veure com els punteres poden ser utilitzats en situacions reals. En el proper mòdul, explorarem les estructures de dades dinàmiques, que sovint es gestionen mitjançant punteres.
Curs de Programació en ALGOL
Mòdul 1: Introducció a ALGOL
Mòdul 2: Sintaxi i Estructura Bàsica
- Estructura del Programa ALGOL
- Variables i Tipus de Dades
- Entrada i Sortida Bàsica
- Operadors i Expressions
Mòdul 3: Estructures de Control
Mòdul 4: Funcions i Procediments
- Definició de Funcions
- Paràmetres de Funció i Valors de Retorn
- Funcions Recursives
- Procediments en ALGOL
Mòdul 5: Estructures de Dades
Mòdul 6: Temes Avançats
Mòdul 7: Aplicacions Pràctiques
- Mètodes Numèrics
- Implementació d'Algorismes
- Construcció d'un Compilador Simple
- Estudis de Cas i Projectes