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
- Punteres i Adreces de Memòria: Un punter és una variable que emmagatzema l'adreça de memòria d'una altra variable.
- 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.
- 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
- Desbordament de Punteres: Assegura't que els punteres no surtin dels límits de l'array. Això pot causar comportament indefinit.
- Punteres No Inicialitzades: Sempre inicialitza els punteres abans d'utilitzar-los per evitar errors de segmentació.
- 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
- Introducció a la Programació
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsiques
Mòdul 2: Tipus de Dades i Variables
Mòdul 3: Flux de Control
Mòdul 4: Funcions
- Introducció a les Funcions
- Arguments de Funció i Valors de Retorn
- Àmbit i Durada de les Variables
- Funcions Recursives
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
- Introducció a la Gestió d'Arxius
- Lectura i Escriptura d'Arxius
- Posicionament d'Arxius
- Gestió d'Errors en Operacions d'Arxius
Mòdul 10: Temes Avançats
- Directives del Preprocessador
- Arguments de Línia de Comandes
- Llistes d'Arguments Variables
- Multifil en C
Mòdul 11: Millors Pràctiques i Optimització
- Llegibilitat del Codi i Documentació
- Tècniques de Depuració
- Optimització del Rendiment
- Consideracions de Seguretat