Confrontare i puntatori
Fa parte della sezione Logica e flusso del percorso C di Coddy. Lezione 10 di 63.
Hai imparato a spostarti negli array usando l’aritmetica dei puntatori. Ora scoprirai che i puntatori possono anche essere confrontati usando gli stessi operatori relazionali che usi con le normali variabili: ==, !=, < e >.
Quando confronti due puntatori, stai confrontando i loro indirizzi di memoria. Questo è particolarmente utile quando entrambi i puntatori puntano a elementi all'interno dello stesso array, poiché ti permette di determinarne le posizioni relative in memoria.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Punta al primo elemento
int *end = numbers + 4; // Punta all'ultimo elemento
if (start < end) {
printf("start comes before end in memory");
}Il confronto tra puntatori diventa particolarmente potente nelle condizioni dei cicli. Invece di usare una variabile contatore, puoi confrontare la posizione attuale del puntatore con un puntatore di destinazione per stabilire quando il ciclo deve fermarsi. Questo permette di creare codice elegante ed efficiente per attraversare gli array.
L'intuizione fondamentale è che ptr1 < ptr2 ti dice che ptr1 punta a un elemento che compare prima nell'array rispetto all'elemento a cui punta ptr2. Questa relazione rende il confronto tra puntatori particolarmente adatto a controllare i cicli che elaborano gli array in sequenza.
Sfida
FacileScrivi un programma C che utilizzi il confronto tra puntatori per attraversare un array e trovare gli elementi compresi in un intervallo specifico. Il programma deve:
- Dichiarare un array di interi chiamato
scorescon 8 elementi e inizializzarlo con i valori {45, 78, 92, 63, 87, 34, 91, 56} - Dichiarare due puntatori a interi:
start_ptreend_ptr - Impostare
start_ptrin modo che punti al primo elemento dell'array - Impostare
end_ptrin modo che punti all'ultimo elemento dell'array usando l'aritmetica dei puntatori - Dichiarare un puntatore chiamato
current_ptre inizializzarlo in modo che punti al primo elemento - Usare un ciclo while con il confronto tra puntatori (
current_ptr <= end_ptr) per attraversare l'array - All'interno del ciclo:
- Verificare se il valore corrente è compreso tra 60 e 90 (inclusi)
- Se il valore è nell'intervallo, stampare "Value [value] is in range"
- Se il valore non è nell'intervallo, stampare "Value [value] is out of range"
- Incrementare
current_ptrper passare all'elemento successivo
- Dopo il ciclo, usare il confronto tra puntatori per verificare che
current_ptrsi trovi ora oltre la fine dell'array, controllando securrent_ptr > end_ptr - Se la condizione è vera, stampare "Traversal complete"
L'output deve mostrare i risultati nel formato seguente:
Value 45 is out of range
Value 78 is in range
Value 92 is out of range
Value 63 is in range
Value 87 is in range
Value 34 is out of range
Value 91 is out of range
Value 56 is out of range
Traversal completeQuesta sfida verifica la tua comprensione degli operatori di confronto tra puntatori nelle condizioni dei cicli, dell'uso dell'aritmetica dei puntatori per impostare i puntatori di confine e di come il confronto tra puntatori possa controllare l'attraversamento di un array in modo più elegante rispetto ai tradizionali cicli basati su contatori.
Provalo tu
#include <stdio.h>
int main() {
// TODO: Scrivi il tuo codice qui sotto
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