Online C Compiler
Apri nel compilatore

Edizione didattica italiana

Puntatori in C

Impara indirizzi, dereferenziazione, limiti e durata degli oggetti.

Apri nel compilatore

Puntatori in C
Impara indirizzi, dereferenziazione, limiti e durata degli oggetti.

Un puntatore contiene un indirizzo associato a un tipo. & ottiene l’indirizzo di un oggetto e * accede all’oggetto puntato. Prima di dereferenziare, verifica che l’oggetto esista e che tipo e durata siano compatibili.

L’aritmetica dei puntatori procede in unità del tipo puntato. Puoi formare un puntatore subito dopo la fine di un array, ma non dereferenziarlo. Sottrazioni e confronti d’ordine devono rispettare le regole sugli elementi dello stesso array.

Passare un puntatore ne copia il valore. Puoi modificare l’oggetto attraverso la copia, ma cambiare la copia non cambia il puntatore del chiamante. Restituisci il nuovo puntatore o usa un puntatore a puntatore per aggiornarlo.

Inizializza i puntatori, controlla le allocazioni e non accedere dopo free. Disegnare oggetti e frecce aiuta a capire liste e array di puntatori.

Codice sorgente

#include <stdio.h>
#include <stdlib.h>

void swap(int *a, int *b) {
    int tmp = *a;
    *a = *b;
    *b = tmp;
}

int main(void) {
    int score = 95;
    int *ptr = &score;

    printf("Value via ptr : %d\n", *ptr);
    *ptr = 100;
    printf("Updated score : %d\n", score);

    int nums[4] = {10, 20, 30, 40};
    int *p = nums;
    for (int i = 0; i < 4; i++) {
        printf("*(p + %d) = %d\n", i, *(p + i));
    }
    printf("Bytes between p and p + 1: %zu\n",
           (size_t)((char *)(p + 1) - (char *)p));

    int x = 1, y = 2;
    swap(&x, &y);
    printf("After swap: x = %d, y = %d\n", x, y);

    int *heap = malloc(3 * sizeof(int));
    if (heap == NULL) {
        return 1;
    }
    for (int i = 0; i < 3; i++) {
        heap[i] = (i + 1) * 5;
    }
    printf("Heap values: %d %d %d\n", heap[0], heap[1], heap[2]);
    free(heap);
    heap = NULL;
    printf("heap is %s after free\n", heap == NULL ? "NULL" : "not NULL");
    return 0;
}
Apri nel compilatore

Risultato atteso

Value via ptr : 95
Updated score : 100
*(p + 0) = 10
*(p + 1) = 20
*(p + 2) = 30
*(p + 3) = 40
Bytes between p and p + 1: 4
After swap: x = 2, y = 1
Heap values: 5 10 15
heap is NULL after free

Domande frequenti

Perché il codice e alcuni risultati restano in inglese?

Parole chiave C, identificatori, commenti del programma e output attesi restano quelli originali per preservare codice eseguibile e test coerenti. Spiegazioni e istruzioni sono tradotte.