Menu
Coddy logo textTech

Passare le struct per valore

Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 46 di 63.

Ora che sai come lavorare con le struct e i puntatori alle struct, è il momento di imparare a passare intere struct alle funzioni. Quando passi una struct a una funzione come parametro, C usa il passaggio per valore, il che significa che la funzione riceve una copia completa della struct.

Ecco la sintassi di una funzione che accetta un parametro struct:

void functionName(struct StructureName parameterName) {
    // Corpo della funzione
}

Usando la nostra familiare struct Point come esempio:

void printPoint(struct Point p) {
    printf("Point coordinates: (%d, %d)\n", p.x, p.y);
}

Il concetto chiave da comprendere è che qualsiasi modifica apporti alla struct all'interno della funzione non influirà sulla struct originale nella funzione chiamante. Questo perché la funzione lavora con una propria copia dei dati.

Questo approccio è utile quando vuoi leggere o visualizzare i dati di una struct senza rischiare di modificare accidentalmente l'originale. Tuttavia, tieni presente che copiare struct di grandi dimensioni può essere inefficiente in termini di memoria e prestazioni.

challenge icon

Sfida

Facile

Crea un programma C che dimostri il passaggio di struct alle funzioni per valore. Il programma deve:

  1. Definire una struct denominata Rectangle con i seguenti membri:
    • Un intero width per memorizzare la larghezza del rettangolo
    • Un intero height per memorizzare l’altezza del rettangolo
    • Un array di caratteri color di dimensione 15 per memorizzare il colore del rettangolo
  2. Scrivere una funzione denominata displayRectangle che:
    • Accetta una struct Rectangle come parametro (passaggio per valore)
    • Stampa le informazioni sul rettangolo in questo formato esatto:
      • Rectangle Details:
      • Width: [width]
      • Height: [height]
      • Color: [color]
      • Area: [area]
    • Calcola e stampa l’area (larghezza × altezza)
  3. Scrivere una funzione denominata modifyRectangle che:
    • Accetta una struct Rectangle come parametro (passaggio per valore)
    • Raddoppia sia la larghezza sia l’altezza del rettangolo
    • Cambia il colore in "Modified"
    • Stampa Inside modifyRectangle function:
    • Chiama displayRectangle per mostrare il rettangolo modificato
  4. Nella funzione principale:
    • Crea una variabile Rectangle denominata rect
    • Legge larghezza, altezza e colore dall’input e li assegna ai membri della struct
    • Stampa Original rectangle:
    • Chiama displayRectangle per mostrare il rettangolo originale
    • Chiama modifyRectangle con il rettangolo
    • Stampa After modifyRectangle call:
    • Chiama di nuovo displayRectangle per mostrare che il rettangolo originale è rimasto invariato

Questa sfida dimostra il concetto chiave del passaggio per valore con le struct: quando passi una struct a una funzione, la funzione riceve una copia completa della struct. Qualsiasi modifica apportata all’interno della funzione riguarda solo la copia, non la struct originale nella funzione chiamante.

Provalo tu

#include <stdio.h>
#include <string.h>

// TODO: Definisci qui la struct Rectangle

// TODO: Scrivi qui la funzione displayRectangle

// TODO: Scrivi qui la funzione modifyRectangle

int main() {
    // Leggi l'input
    int width, height;
    char color[15];
    
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%s", color);
    
    // TODO: Crea una variabile Rectangle e assegnale i valori di input
    
    // TODO: Stampa "Original rectangle:" e chiama displayRectangle
    
    // TODO: Chiama modifyRectangle
    
    // TODO: Stampa "After modifyRectangle call:" e chiama di nuovo displayRectangle
    
    return 0;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore C online