Aritmetica dei puntatori
Incrementare un puntatore tipizzato avanza di un elemento completo.
Che cos’è Aritmetica dei puntatori?
Incrementare un puntatore tipizzato avanza di un elemento completo.
Scorri memoria contigua con puntatori e iteratori.
Punti importanti
- Ogni puntatore deve riferirsi a un oggetto vivo compatibile o essere null.
- Ogni allocation posseduta va liberata una sola volta.
- Esprimi chiaramente ownership e const.
Esempi di codice C e C++
main.c
#include <stdio.h>
int main(void) {
int values[] = {10, 20, 30, 40};
int sum = 0;
for (int *p = values; p < values + 4; ++p) sum += *p;
printf("sum=%d distance=%td\n", sum, (values + 4) - values);
return 0;
}
sum=100 distance=4
C++
main.cpp
#include <iostream>
#include <vector>
int main() {
std::vector values{10, 20, 30, 40};
int sum = 0;
for (auto it = values.begin(); it != values.end(); ++it) sum += *it;
std::cout << "sum=" << sum << " distance="
<< std::distance(values.begin(), values.end()) << '\n';
}
sum=100 distance=4
Confronto tra C e C++
È definita solo nello stesso array fino a one-past-end; gli iteratori C++ generalizzano il percorso ai container.
C
Ownership e cleanup sono convenzioni manuali.
C++
Container e RAII codificano ownership e cleanup nel lifetime.
Esercizi pratici
Esegui entrambe le versioni e modificale per osservare le diverse garanzie.
- Testa null e fallimenti di allocation.
- Usa AddressSanitizer e UndefinedBehaviorSanitizer.
- Documenta ownership di ogni puntatore.