Menu
Coddy logo textTech

Puntatore o valore

Fa parte della sezione Programmazione orientata agli oggetti del percorso C di Coddy. Lezione 9 di 61.

Quando passi una struct a una funzione, C ti offre due opzioni: passarla per valore (copiare l'intera struct) oppure per puntatore (copiare solo l'indirizzo). La scelta ha un impatto significativo sulle prestazioni.

Il passaggio per valore crea una copia completa della struct sullo stack. Per una struct piccola con pochi interi, va bene. Ma immagina una struct di centinaia di byte: ogni chiamata di funzione copia tutti quei dati:

typedef struct {
    char name[100];
    int scores[50];
    double average;
} Student;

// Per valore: copia ~308 byte a ogni chiamata
void print_by_value(Student s) {
    printf("%s: %.2f\n", s.name, s.average);
}

// Per puntatore: copia solo 8 byte (l'indirizzo)
void print_by_pointer(const Student *s) {
    printf("%s: %.2f\n", s->name, s->average);
}

Anche la sintassi è diversa. Con un parametro valore, usi l'operatore punto (s.name). Con un puntatore, usi l'operatore freccia (s->name).

La versione con puntatore è più efficiente perché passa solo un indirizzo di memoria, in genere di 8 byte indipendentemente dalle dimensioni della struct.

Ecco perché i programmatori C passano quasi sempre le strutture tramite puntatore. Usa const quando la funzione non dovrebbe modificare i dati e un puntatore normale quando dovrebbe. Ottieni così efficienza e chiarezza d’intento.

challenge icon

Sfida

Facile

Creiamo un modulo Product che dimostra la differenza tra passare le struct per valore e tramite puntatore. Creerai due funzioni di visualizzazione: una che riceve l'intera struct come copia e una che riceve solo un puntatore a essa.

Creerai tre file:

  • product.h: dichiara una struct Product con tre membri: char name[50], double price e int quantity. Dichiara anche due funzioni:
    • display_by_value: riceve una Product per valore e stampa le sue informazioni
    • display_by_pointer: riceve una const Product * e stampa le stesse informazioni
    Usa le protezioni contro le inclusioni multiple con il simbolo PRODUCT_H.
  • product.c: implementa entrambe le funzioni. Nota la differenza nella sintassi: la versione per valore usa l'operatore punto (p.name), mentre la versione con puntatore usa l'operatore freccia (p->name). Entrambe le funzioni devono stampare nello stesso formato.
  • main.c: crea un Product, poi chiama entrambe le funzioni di visualizzazione per mostrare che producono un output identico, pur usando stili diversi per i parametri.

Riceverai tre input: il nome del prodotto (una stringa), il prezzo (un double) e la quantità (un intero).

Nel file principale, inizializza una Product con questi valori, poi chiama display_by_value seguito da display_by_pointer.

Entrambe le funzioni devono stampare in questo formato:

Product: {name}, Price: {price}, Qty: {quantity}

Usa %.2f per visualizzare il prezzo con due cifre decimali.

Per esempio, con gli input Laptop, 999.99 e 5, l'output sarebbe:

Product: Laptop, Price: 999.99, Qty: 5
Product: Laptop, Price: 999.99, Qty: 5

Provalo tu

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

int main() {
    char name[50];
    double price;
    int quantity;
    
    // Leggi i dati in input
    scanf("%s", name);
    scanf("%lf", &price);
    scanf("%d", &quantity);
    
    // TODO: Crea una variabile Product e inizializzala con i valori in input
    // Suggerimento: usa strcpy per copiare il nome nel campo name della struct
    
    // TODO: Chiama display_by_value con la variabile Product
    
    // TODO: Chiama display_by_pointer con un puntatore alla variabile Product
    
    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 Programmazione orientata agli oggetti

Esercitati da solo: Compilatore C online