I nomi degli array come puntatori
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 7 di 63.
Gli array e i puntatori in C hanno una relazione speciale, fondamentale per capire come C gestisce i dati in memoria. Quando dichiari un array, il nome dell'array stesso funge da puntatore costante al primo elemento dell'array.
Questo significa che quando hai un array come int numbers[5];, il nome numbers è essenzialmente un puntatore che punta sempre a numbers[0]. Puoi pensare al nome dell'array come a un puntatore integrato che non devi dichiarare separatamente.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' punta al primo elemento
// numbers == &numbers[0] // Queste espressioni sono equivalenti!Questa equivalenza è fondamentale: numbers e &numbers[0] ti forniscono entrambi esattamente lo stesso indirizzo di memoria. Il nome dell’array è semplicemente un modo più pratico per fare riferimento all’indirizzo del primo elemento senza dover usare l’operatore di indirizzo.
Comprendere questa relazione apre la strada all’uso delle tecniche con i puntatori negli array, che possono rendere il tuo codice più flessibile ed efficiente. La differenza fondamentale è che, a differenza dei puntatori normali, i nomi degli array sono puntatori costanti: non puoi cambiare ciò a cui puntano.
Sfida
FacileScrivi un programma in C che dimostri l'equivalenza tra i nomi degli array e i puntatori ai loro primi elementi. Il programma dovrebbe:
- Dichiarare un array di interi chiamato
numberscon 4 elementi e inizializzarlo con i valori {10, 20, 30, 40} - Dichiarare un puntatore a intero chiamato
ptr - Assegnare il nome dell'array
numbersal puntatoreptr - Stampare l'indirizzo contenuto in
numbersusandoprintfcon lo specificatore di formato%p - Stampare l'indirizzo del primo elemento
&numbers[0]usandoprintfcon lo specificatore di formato%p - Stampare l'indirizzo contenuto in
ptrusandoprintfcon lo specificatore di formato%p - Stampare il valore del primo elemento usando il nome dell'array:
*numbers - Stampare il valore del primo elemento usando il puntatore:
*ptr
L'output dovrebbe mostrare i risultati nel seguente formato:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10Questa sfida dimostra che il nome dell'array agisce come un puntatore costante al primo elemento e che numbers, &numbers[0] e ptr contengono tutti lo stesso indirizzo di memoria quando a ptr viene assegnato il nome dell'array.
Provalo tu
#include <stdio.h>
int main() {
// TODO: Scrivi qui il tuo codice
// 1. Dichiara e inizializza l'array 'numbers' con {10, 20, 30, 40}
// 2. Dichiara un puntatore a un intero chiamato 'ptr'
// 3. Assegna il nome dell'array al puntatore
// 4. Stampa tutti gli indirizzi e i valori richiesti
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 funzioni3Array 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