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
- Increment i Decrement de Punteres: Afegir o restar un valor a una puntera.
- Sumar i Restar Enters a Punteres: Manipular la posició de la puntera en la memòria.
- Diferència entre Punteres: Calcular la distància entre dues punteres.
- 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 siptr1
apunta a una adreça de memòria anterior aptr2
.
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.
Curs de Programació en C++
Mòdul 1: Introducció al C++
- Introducció al C++
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Entrada i Sortida
Mòdul 2: Estructures de Control
Mòdul 3: Funcions
- Introducció a les Funcions
- Paràmetres de Funció i Tipus de Retorn
- Sobrecàrrega de Funcions
- Recursivitat
Mòdul 4: Arrays i Strings
Mòdul 5: Punteres i Referències
- Introducció als Punteres
- Aritmètica de Punteres
- Punteres i Arrays
- Referències
- Assignació Dinàmica de Memòria
Mòdul 6: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Constructors i Destructors
- Herència
- Polimorfisme
- Encapsulació i Abstracció
Mòdul 7: Temes Avançats
- Plantilles
- Gestió d'Excepcions
- Entrada/Sortida de Fitxers
- Biblioteca de Plantilles Estàndard (STL)
- Expressions Lambda
- Multifil