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);
endExplicació del Codi
-
Declaració de Variables:
integer a;declara una variableade tipus enter.integer *p;declara un punterpque pot apuntar a una variable de tipus enter.
-
Inicialització:
a := 10;assigna el valor 10 a la variablea.p := &a;assigna l'adreça deaal 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
endPunteres 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));
endExplicació 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);
endSolució
-
Declaració de la Funció:
procedure swap(integer *x, integer *y);declara una funcióswapque pren dos punteres a enters com a paràmetres.
-
Intercanvi de Valors:
temp := *x;emmagatzema el valor apuntat perxentemp.*x := *y;assigna el valor apuntat perya la variable apuntada perx.*y := temp;assigna el valor emmagatzemat entempa la variable apuntada pery.
-
Crida a la Funció:
swap(&a, &b);crida la funcióswappassant les adreces deaib.
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], " ");
endSolució
-
Declaració de la Funció:
procedure reverseArray(integer *arr, integer size);declara una funcióreverseArrayque pren un punter a un array i la seva mida com a paràmetres.
-
Inicialització de Punteres:
start := arr;inicialitzastartamb l'adreça del primer element de l'array.end := arr + size - 1;inicialitzaendamb l'adreça de l'últim element de l'array.
-
Inversió de l'Array:
while start < end doitera mentrestartsigui menor queend.temp := *start; *start := *end; *end := temp;intercanvia els valors apuntats perstartiend.start := start + 1; end := end - 1;mou els punteresstartiendcap 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
