Elementi degli array e puntatori
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 8 di 63.
Ora che hai capito come i nomi degli array funzionano da puntatori, puoi usare questa conoscenza per accedere agli elementi di un array in un modo completamente diverso. Invece di usare la nota notazione con le parentesi quadre, come array[i], puoi usare la notazione con i puntatori per ottenere lo stesso risultato.
L'intuizione chiave è che array[i] è esattamente equivalente a *(array + i). Quando scrivi array + i, stai dicendo a C di spostarsi in avanti di i posizioni dall'inizio dell'array. L'operatore di dereferenziazione * ottiene quindi il valore in quella posizione.
int numbers[5] = {10, 20, 30, 40, 50};
// Queste due righe fanno esattamente la stessa cosa:
printf("%d", numbers[2]); // Stampa 30
printf("%d", *(numbers + 2)); // Stampa anche 30Questa notazione con i puntatori funziona perché C calcola automaticamente l’indirizzo di memoria corretto in base alle dimensioni del tipo di dati. Quando aggiungi 2 a un puntatore a un array di interi, C avanza di 2 × sizeof(int) byte, arrivando esattamente al terzo elemento.
Comprendere questa equivalenza ti dà flessibilità nel lavorare con gli array e ti prepara a tecniche con i puntatori più avanzate, che incontrerai man mano che continuerai a imparare C.
Sfida
FacileScrivi un programma in C che dimostri come accedere agli elementi di un array usando la notazione con puntatori invece della tradizionale indicizzazione degli array. Il tuo programma dovrebbe:
- Dichiarare un array di interi chiamato
valuescon 6 elementi e inizializzarlo con i valori {5, 15, 25, 35, 45, 55} - Usare un ciclo for per scorrere tutti gli elementi dell'array
- All'interno del ciclo, usare la notazione con puntatori
*(values + i)per accedere a ciascun elemento (non usare la notazione con parentesi quadre comevalues[i]) - Stampare ciascun elemento usando il metodo di accesso con la notazione con puntatori
- Dopo il ciclo, dimostrare l'equivalenza stampando il terzo elemento (indice 2) usando entrambi i metodi:
- Prima usando la notazione con puntatori:
*(values + 2) - Poi usando la notazione tradizionale degli array:
values[2]
- Prima usando la notazione con puntatori:
Il tuo output dovrebbe mostrare i risultati nel seguente formato:
Element 0: 5
Element 1: 15
Element 2: 25
Element 3: 35
Element 4: 45
Element 5: 55
Third element via pointer: 25
Third element via array: 25Questa sfida verifica la tua comprensione dell'equivalenza tra array[i] e *(array + i), dimostrando come l'aritmetica dei puntatori consenta di accedere agli elementi di un array usando calcoli degli indirizzi di memoria invece della tradizionale indicizzazione.
Provalo tu
#include <stdio.h>
int main() {
// TODO: Scrivi il tuo codice qui
// Dichiara e inizializza l'array 'values' con 6 elementi
// Usa un ciclo for per stampare ogni elemento con la notazione dei puntatori *(values + i)
// Dopo il ciclo, stampa il terzo elemento usando sia la notazione dei puntatori sia quella degli array
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