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

  1. 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.
  2. Declaració de Punteres

    • Els punteres es declaren especificant el tipus de dades que apunten seguit d'un asterisc (*).
  3. Inicialització de Punteres

    • Els punteres es poden inicialitzar amb l'adreça d'una variable utilitzant l'operador d'adreça (&).
  4. 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.

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

  1. Declaració de Variables:

    • integer a; declara una variable a de tipus enter.
    • integer *p; declara un punter p que pot apuntar a una variable de tipus enter.
  2. Inicialització:

    • a := 10; assigna el valor 10 a la variable a.
    • p := &a; assigna l'adreça de a al punter p.
  3. Accés a Valors:

    • print("El valor de a és: ", a); imprimeix el valor de a.
    • print("L'adreça de a és: ", p); imprimeix l'adreça de a (emmagatzemada en p).
    • print("El valor apuntat per p és: ", *p); imprimeix el valor emmagatzemat a l'adreça apuntada per p (és a dir, el valor de a).

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

  1. 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.
  2. Assignació del Punter:

    • p := &array[0]; assigna l'adreça del primer element de l'array al punter p.
  3. 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ó

  1. Declaració de la Funció:

    • procedure swap(integer *x, integer *y); declara una funció swap que pren dos punteres a enters com a paràmetres.
  2. Intercanvi de Valors:

    • temp := *x; emmagatzema el valor apuntat per x en temp.
    • *x := *y; assigna el valor apuntat per y a la variable apuntada per x.
    • *y := temp; assigna el valor emmagatzemat en temp a la variable apuntada per y.
  3. Crida a la Funció:

    • swap(&a, &b); crida la funció swap passant les adreces de a i b.

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ó

  1. 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.
  2. Inicialització de Punteres:

    • start := arr; inicialitza start amb l'adreça del primer element de l'array.
    • end := arr + size - 1; inicialitza end amb l'adreça de l'últim element de l'array.
  3. Inversió de l'Array:

    • while start < end do itera mentre start sigui menor que end.
    • temp := *start; *start := *end; *end := temp; intercanvia els valors apuntats per start i end.
    • start := start + 1; end := end - 1; mou els punteres start i end 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.

© Copyright 2024. Tots els drets reservats