En aquest tema, explorarem el concepte de punteres a punteres en el llenguatge de programació C. Els punteres a punteres són una característica avançada que permet manipular punteres de manera més flexible i potent. Aquest concepte és especialment útil en la gestió de matrius dinàmiques, llistes enllaçades i altres estructures de dades complexes.

Conceptes Clau

  1. Definició de Punteres a Punteres: Un punter a punter és una variable que emmagatzema l'adreça d'un altre punter.
  2. Declaració de Punteres a Punteres: La sintaxi per declarar un punter a punter és similar a la dels punteres simples, però amb un asterisc addicional.
  3. Ús de Punteres a Punteres: Els punteres a punteres es poden utilitzar per modificar el valor dels punteres als quals apunten.

Declaració de Punteres a Punteres

La declaració d'un punter a punter segueix la següent sintaxi:

int **pp;

En aquest exemple, pp és un punter a un punter a un enter.

Exemples Pràctics

Exemple 1: Assignació i Accés a Punteres a Punteres

#include <stdio.h>

int main() {
    int var = 10;
    int *p;
    int **pp;

    p = &var;  // p apunta a var
    pp = &p;   // pp apunta a p

    // Mostrem els valors
    printf("Valor de var: %d\n", var);
    printf("Valor de *p: %d\n", *p);
    printf("Valor de **pp: %d\n", **pp);

    // Mostrem les adreces
    printf("Adreça de var: %p\n", (void*)&var);
    printf("Adreça emmagatzemada a p: %p\n", (void*)p);
    printf("Adreça emmagatzemada a pp: %p\n", (void*)pp);

    return 0;
}

Explicació

  1. Declaració de Variables:

    • int var = 10; declara una variable enter var i l'assigna a 10.
    • int *p; declara un punter a un enter p.
    • int **pp; declara un punter a un punter a un enter pp.
  2. Assignació de Punteres:

    • p = &var; assigna l'adreça de var a p.
    • pp = &p; assigna l'adreça de p a pp.
  3. Accés als Valors:

    • *p retorna el valor de var (10).
    • **pp retorna el valor de *p, que és el valor de var (10).
  4. Accés a les Adreces:

    • &var retorna l'adreça de var.
    • p emmagatzema l'adreça de var.
    • pp emmagatzema l'adreça de p.

Exemple 2: Modificació de Valors Usant Punteres a Punteres

#include <stdio.h>

void modifyValue(int **pp) {
    **pp = 20;
}

int main() {
    int var = 10;
    int *p = &var;
    int **pp = &p;

    printf("Abans de modificar: %d\n", var);
    modifyValue(pp);
    printf("Després de modificar: %d\n", var);

    return 0;
}

Explicació

  1. Funció modifyValue:

    • La funció modifyValue pren un punter a punter a un enter com a argument.
    • **pp = 20; modifica el valor de la variable a la qual apunta el punter pp.
  2. Funció main:

    • Declara i inicialitza var, p i pp.
    • Mostra el valor de var abans i després de cridar la funció modifyValue.

Exercicis Pràctics

Exercici 1: Intercanvi de Valors Usant Punteres a Punteres

Escriu una funció que intercanviï els valors de dues variables enteres utilitzant punteres a punteres.

#include <stdio.h>

void swap(int **a, int **b) {
    int *temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    int *px = &x, *py = &y;

    printf("Abans de l'intercanvi: x = %d, y = %d\n", x, y);
    swap(&px, &py);
    printf("Després de l'intercanvi: x = %d, y = %d\n", *px, *py);

    return 0;
}

Solució

  1. Funció swap:

    • La funció swap pren dos punteres a punteres a enters com a arguments.
    • Intercanvia els valors dels punteres utilitzant una variable temporal.
  2. Funció main:

    • Declara i inicialitza x, y, px i py.
    • Mostra els valors de x i y abans i després de cridar la funció swap.

Errors Comuns i Consells

  1. Desreferenciació Incorrecta: Assegura't de desreferenciar correctament els punteres a punteres. Un error comú és oblidar un asterisc, el que pot causar errors de compilació o comportaments inesperats.
  2. Inicialització de Punteres: Sempre inicialitza els punteres abans d'utilitzar-los per evitar accessos a memòria no vàlida.
  3. Comprensió de l'Àmbit: Tingues en compte l'àmbit de les variables i punteres per evitar errors de referència fora de l'àmbit.

Conclusió

Els punteres a punteres són una eina poderosa en C que permeten una major flexibilitat en la manipulació de dades. Comprendre com declarar, assignar i utilitzar punteres a punteres és essencial per treballar amb estructures de dades complexes i per escriure codi més eficient i modular. Amb la pràctica, l'ús de punteres a punteres esdevindrà una segona naturalesa en el teu repertori de programació en C.

Curs de Programació en C

Mòdul 1: Introducció al C

Mòdul 2: Tipus de Dades i Variables

Mòdul 3: Flux de Control

Mòdul 4: Funcions

Mòdul 5: Arrays i Strings

Mòdul 6: Punteres

Mòdul 7: Estructures i Unions

Mòdul 8: Assignació Dinàmica de Memòria

Mòdul 9: Gestió d'Arxius

Mòdul 10: Temes Avançats

Mòdul 11: Millors Pràctiques i Optimització

Mòdul 12: Projecte i Avaluació Final

© Copyright 2024. Tots els drets reservats