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 + 2mou la puntera dues posicions endavant.ptr - 1mou 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 - ptr1retorna 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 < ptr2verifica siptr1apunta 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
