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
