Introducció

L'aritmètica de punteres és una característica poderosa del llenguatge C que permet manipular adreces de memòria directament. Aquesta capacitat és útil per treballar amb arrays, estructures de dades dinàmiques i altres operacions de baix nivell. En aquest tema, aprendrem com funciona l'aritmètica de punteres i com utilitzar-la de manera segura i eficient.

Conceptes Clau

  1. Punteres i Adreces de Memòria: Un punter és una variable que emmagatzema l'adreça de memòria d'una altra variable.
  2. Operacions Permeses: Les operacions aritmètiques que es poden realitzar amb punteres inclouen la suma, la resta, la comparació i la diferència entre punteres.
  3. Increment i Decrement: Els punteres es poden incrementar (++) o decrementar (--) per apuntar a la següent o anterior posició de memòria.

Operacions Aritmètiques amb Punteres

Increment i Decrement

Quan incrementem (++) o decrementem (--) un punter, aquest es mou a la següent o anterior posició de memòria segons el tipus de dada al qual apunta.

#include <stdio.h>

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

    printf("Valor inicial: %d\n", *ptr); // 10

    ptr++; // Incrementa el punter
    printf("Després d'incrementar: %d\n", *ptr); // 20

    ptr--; // Decrementa el punter
    printf("Després de decrementar: %d\n", *ptr); // 10

    return 0;
}

Suma i Resta

Podem sumar o restar un enter a un punter per moure'l diverses posicions endavant o enrere.

#include <stdio.h>

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

    ptr = ptr + 2; // Mou el punter dues posicions endavant
    printf("Després de sumar 2: %d\n", *ptr); // 30

    ptr = ptr - 1; // Mou el punter una posició enrere
    printf("Després de restar 1: %d\n", *ptr); // 20

    return 0;
}

Diferència entre Punteres

Podem calcular la diferència entre dos punteres que apunten al mateix array. La diferència és el nombre d'elements entre les dues posicions.

#include <stdio.h>

int main() {
    int arr[5] = {10, 20, 30, 40, 50};
    int *ptr1 = &arr[1]; // Apunta al segon element
    int *ptr2 = &arr[4]; // Apunta al cinquè element

    int diff = ptr2 - ptr1; // Diferència entre punteres
    printf("Diferència entre punteres: %d\n", diff); // 3

    return 0;
}

Exercicis Pràctics

Exercici 1

Escriu un programa que recorri un array d'enters utilitzant un punter i imprimeixi tots els seus elements.

Solució

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;

    for (int i = 0; i < 5; i++) {
        printf("Element %d: %d\n", i, *(ptr + i));
    }

    return 0;
}

Exercici 2

Escriu un programa que calculi la suma de tots els elements d'un array utilitzant aritmètica de punteres.

Solució

#include <stdio.h>

int main() {
    int arr[5] = {1, 2, 3, 4, 5};
    int *ptr = arr;
    int sum = 0;

    for (int i = 0; i < 5; i++) {
        sum += *(ptr + i);
    }

    printf("La suma dels elements és: %d\n", sum);

    return 0;
}

Errors Comuns i Consells

  1. Desbordament de Punteres: Assegura't que els punteres no surtin dels límits de l'array. Això pot causar comportament indefinit.
  2. Punteres No Inicialitzades: Sempre inicialitza els punteres abans d'utilitzar-los per evitar errors de segmentació.
  3. Comparació de Punteres: Només compara punteres que apunten al mateix bloc de memòria (per exemple, el mateix array).

Resum

En aquest tema, hem après els conceptes bàsics de l'aritmètica de punteres, incloent-hi com incrementar, decrementar, sumar i restar punteres, així com calcular la diferència entre punteres. També hem vist exemples pràctics i exercicis per reforçar aquests conceptes. Amb aquesta base, estàs preparat per treballar amb punteres de manera més avançada en els següents temes.

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