Puntatori e memoria

Puntatori e indirizzi

Un puntatore contiene l’indirizzo di un oggetto compatibile.

Che cos’è Puntatori e indirizzi?

Un puntatore contiene l’indirizzo di un oggetto compatibile.

Memorizza un indirizzo, dereferenzialo e modifica l’oggetto.

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++

C
Esegui →
main.c
#include <stdio.h>

int main(void) {
    int score = 70;
    int *score_ptr = &score;
    *score_ptr += 5;
    printf("score=%d same-address=%s\n", score,
           score_ptr == &score ? "yes" : "no");
    return 0;
}
Output previsto
score=75 same-address=yes
C++
Esegui →
main.cpp
#include <iostream>

int main() {
    int score = 70;
    int* score_ptr = &score;
    *score_ptr += 5;
    std::cout << "score=" << score << " same-address="
              << std::boolalpha << (score_ptr == &score) << '\n';
}
Output previsto
score=75 same-address=true

Confronto tra C e C++

C usa raw pointer direttamente. C++ li mantiene per accesso non owning e preferisce reference quando null non è valido.

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.