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.
Sfida
FacileCrea un programma C che dimostri il passaggio di struct alle funzioni per valore. Il programma deve:
- Definire una
structdenominataRectanglecon i seguenti membri:- Un intero
widthper memorizzare la larghezza del rettangolo - Un intero
heightper memorizzare l’altezza del rettangolo - Un array di caratteri
colordi dimensione 15 per memorizzare il colore del rettangolo
- Un intero
- Scrivere una funzione denominata
displayRectangleche:- Accetta una struct
Rectanglecome 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)
- Accetta una struct
- Scrivere una funzione denominata
modifyRectangleche:- Accetta una struct
Rectanglecome parametro (passaggio per valore) - Raddoppia sia la larghezza sia l’altezza del rettangolo
- Cambia il colore in "Modified"
- Stampa
Inside modifyRectangle function: - Chiama
displayRectangleper mostrare il rettangolo modificato
- Accetta una struct
- Nella funzione principale:
- Crea una variabile
Rectangledenominatarect - Legge larghezza, altezza e colore dall’input e li assegna ai membri della struct
- Stampa
Original rectangle: - Chiama
displayRectangleper mostrare il rettangolo originale - Chiama
modifyRectanglecon il rettangolo - Stampa
After modifyRectangle call: - Chiama di nuovo
displayRectangleper mostrare che il rettangolo originale è rimasto invariato
- Crea una variabile
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;
}Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Fondamenti dei puntatori
Che cos’è un puntatore?Dichiarare i puntatoriL’operatore di indirizzo (&)L’operatore di dereferenziazione (*)Puntatori NULLRiepilogo: nozioni di base sui puntatori4Progetto: Utility di testo semplice
Panoramica del progettoConteggio dei caratteri2Puntatori e array
I nomi degli array come puntatoriElementi degli array e puntatoriAritmetica dei puntatoriConfrontare i puntatoriRiepilogo: attraversamento di un array con i puntatori5Puntatori e funzioni
Passaggio per valorePassare puntatori alle funzioniModificare le variabili tramite puntatoriUn esempio classico: scambiare valoriPassare array alle funzioniRiepilogo: argomenti puntatore nelle funzioni8Struct e puntatori
Puntatori a structL’operatore freccia (->)Passare le struct per valorePassare puntatori a structAllocazione dinamica delle structRiepilogo: modifica di una struct - puntatore3Array di caratteri e stringhe
Stringhe come array di charIl terminatore nullInput di stringhe con scanfUso di strlen()Uso di strcpy()Uso di strcat()Uso di strcmp()Riepilogo: funzioni di base per le stringhe6Gestione della memoria
Memoria Stack vs. HeapAllocazione dinamica - malloc()Usare sizeof() per l'allocazioneVerificare il fallimento dell'allocazioneLiberare la memoria con free()Allocare con calloc()Riepilogo: array dinamico9Progetto: Inserimento semplice di un contatto
Progetto: Definire una struct ContattoFunzione per creare un contattoEsercitati da solo: Compilatore C online