Introducció

L'aritmètica de punteres és una característica poderosa i, alhora, perillosa del llenguatge C++. Permet manipular adreces de memòria directament, cosa que pot ser molt útil en certes situacions, però també pot conduir a errors difícils de detectar si no es fa servir correctament. En aquest tema, aprendrem com funciona l'aritmètica de punteres i com utilitzar-la de manera segura.

Conceptes Clau

  1. Increment i Decrement de Punteres: Afegir o restar un valor a una puntera.
  2. Sumar i Restar Enters a Punteres: Manipular la posició de la puntera en la memòria.
  3. Diferència entre Punteres: Calcular la distància entre dues punteres.
  4. Comparació de Punteres: Comparar adreces de memòria.

Increment i Decrement de Punteres

Quan incrementem o decrementem una puntera, estem movent la puntera a la següent o anterior posició de memòria segons el tipus de dades que apunta.

Exemple

#include <iostream>
using namespace std;

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr = arr; // ptr apunta al primer element de l'array

    cout << "Valor inicial: " << *ptr << endl; // 10

    ptr++; // Incrementem la puntera
    cout << "Després d'incrementar: " << *ptr << endl; // 20

    ptr--; // Decrementem la puntera
    cout << "Després de decrementar: " << *ptr << endl; // 10

    return 0;
}

Explicació

  • ptr++ incrementa la puntera per apuntar al següent element de l'array.
  • ptr-- decrementa la puntera per apuntar a l'element anterior.

Sumar i Restar Enters a Punteres

Podem sumar o restar un enter a una puntera per moure'ns diverses posicions en la memòria.

Exemple

#include <iostream>
using namespace std;

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr = arr; // ptr apunta al primer element de l'array

    ptr = ptr + 2; // Moure la puntera dues posicions endavant
    cout << "Després de sumar 2: " << *ptr << endl; // 30

    ptr = ptr - 1; // Moure la puntera una posició enrere
    cout << "Després de restar 1: " << *ptr << endl; // 20

    return 0;
}

Explicació

  • ptr + 2 mou la puntera dues posicions endavant.
  • ptr - 1 mou la puntera una posició enrere.

Diferència entre Punteres

Podem calcular la distància entre dues punteres que apunten al mateix array.

Exemple

#include <iostream>
using namespace std;

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr1 = arr; // ptr1 apunta al primer element
    int *ptr2 = &arr[3]; // ptr2 apunta al quart element

    int diff = ptr2 - ptr1; // Calcular la distància entre les punteres
    cout << "Distància entre ptr2 i ptr1: " << diff << endl; // 3

    return 0;
}

Explicació

  • ptr2 - ptr1 retorna el nombre d'elements entre les dues punteres.

Comparació de Punteres

Podem comparar punteres per veure si apunten a la mateixa adreça o per determinar l'ordre en la memòria.

Exemple

#include <iostream>
using namespace std;

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr1 = arr; // ptr1 apunta al primer element
    int *ptr2 = &arr[3]; // ptr2 apunta al quart element

    if (ptr1 < ptr2) {
        cout << "ptr1 apunta a una adreça anterior a ptr2" << endl;
    } else {
        cout << "ptr1 apunta a una adreça posterior a ptr2" << endl;
    }

    return 0;
}

Explicació

  • ptr1 < ptr2 verifica si ptr1 apunta a una adreça de memòria anterior a ptr2.

Exercicis Pràctics

Exercici 1

Escriu un programa que defineixi un array de 10 enters i utilitzi una puntera per imprimir els elements de l'array en ordre invers.

Solució

#include <iostream>
using namespace std;

int main() {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    int *ptr = arr + 9; // Apunta a l'últim element de l'array

    for (int i = 0; i < 10; i++) {
        cout << *ptr << " ";
        ptr--; // Decrementa la puntera
    }

    return 0;
}

Exercici 2

Escriu un programa que calculi la distància entre dues punteres que apunten a elements diferents d'un array de caràcters.

Solució

#include <iostream>
using namespace std;

int main() {
    char arr[6] = {'a', 'b', 'c', 'd', 'e', 'f'};
    char *ptr1 = &arr[1]; // Apunta al segon element
    char *ptr2 = &arr[4]; // Apunta al cinquè element

    int diff = ptr2 - ptr1; // Calcular la distància entre les punteres
    cout << "Distància entre ptr2 i ptr1: " << diff << endl; // 3

    return 0;
}

Errors Comuns i Consells

  • Desbordament de Punteres: Assegura't que les operacions amb punteres no surtin dels límits de l'array.
  • Punteres No Inicialitzades: Sempre inicialitza les punteres abans d'usar-les.
  • Comparació de Punteres: Només compara punteres que apunten al mateix bloc de memòria (per exemple, el mateix array).

Conclusió

L'aritmètica de punteres és una eina potent en C++ que permet manipular adreces de memòria directament. Tot i que pot ser molt útil, és important utilitzar-la amb cura per evitar errors difícils de detectar. Amb la pràctica, podràs utilitzar l'aritmètica de punteres de manera efectiva i segura.

© Copyright 2024. Tots els drets reservats