Fondamenti di C/C++

Funzioni e passaggio dei parametri in C e C++

In questa lezione confronterai tre modi di passare i parametri a una funzione: per valore, per puntatore e per riferimento.

Introduzione

Per impostazione predefinita, quando passi una variabile a una funzione, C e C++ ne creano una copia, quindi le modifiche dentro la funzione non toccano la variabile originale. Se la funzione deve modificare l'originale, chi la chiama deve permetterlo esplicitamente, con un puntatore in C o un riferimento in C++.

Punti importanti

  • Attiva gli avvisi del compilatore (compiler warning) e correggili tutti.
  • Comprendi bene il tipo di dato e la durata (lifetime) di ogni valore.
  • Controlla sempre i dati in ingresso e i limiti degli indici degli array.

Esempi di codice C e C++

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

void swap_ints(int *left, int *right) {
    int temporary = *left;
    *left = *right;
    *right = temporary;
}

int main(void) {
    int a = 4, b = 9;
    swap_ints(&a, &b);
    printf("%d %d\n", a, b);
    return 0;
}
Risultato dell'esecuzione
9 4
C++
Esegui →
main.cpp
#include <iostream>

void swap_ints(int& left, int& right) {
    int temporary = left;
    left = right;
    right = temporary;
}

int main() {
    int a = 4, b = 9;
    swap_ints(a, b);
    std::cout << a << ' ' << b << '\n';
}
Risultato dell'esecuzione
9 4

Confronto tra C e C++

In C, la funzione swap_ints riceve l'indirizzo delle due variabili e usa l'operatore * per accedervi e scambiarne i valori. In C++, il riferimento (reference) funziona come un altro nome per la variabile originale, quindi la sintassi è più breve e modifica comunque il valore. La parola chiave const su un parametro indica che la funzione legge i dati senza modificarli.

C

C usa piccole funzioni procedurali e mostra apertamente come i dati sono rappresentati in memoria.

C++

C++ continua a permettere il lavoro a basso livello, ma aggiunge tipi di libreria e astrazioni più sicure.

Esercizi di approfondimento

Esegui entrambe le versioni e poi modifica il codice per osservare la differenza di sicurezza che offre ciascun linguaggio.

  • Prova input non validi e valori ai limiti.
  • Compila con i flag -Wall -Wextra -Wpedantic per attivare più avvisi.
  • Sposta le dichiarazioni condivise in un file header e l'implementazione in un altro file.

Esercitati con una sfida

Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.

Tutte le sfide