Pointer vergleichen
Teil des Abschnitts Logik & Ablauf der C-Journey von Coddy. Lektion 10 von 63.
Du hast gelernt, wie du dich mithilfe von Zeigerarithmetik durch Arrays bewegst. Jetzt wirst du entdecken, dass Zeiger auch mit denselben Vergleichsoperatoren verglichen werden können, die du bei normalen Variablen verwendest: ==, !=, < und >.
Wenn du zwei Zeiger vergleichst, vergleichst du ihre Speicheradressen. Das ist besonders nützlich, wenn beide Zeiger auf Elemente desselben Arrays zeigen, da du so ihre relative Position im Speicher bestimmen kannst.
int numbers[5] = {10, 20, 30, 40, 50};
int *start = numbers; // Zeigt auf das erste Element
int *end = numbers + 4; // Zeigt auf das letzte Element
if (start < end) {
printf("start comes before end in memory");
}Zeigervergleiche sind besonders leistungsfähig in Schleifenbedingungen. Anstatt eine Zählervariable zu verwenden, kannst du deine aktuelle Zeigerposition mit einem Zielzeiger vergleichen, um zu steuern, wann die Schleife enden soll. So entsteht eleganter, effizienter Code für das Durchlaufen von Arrays.
Die entscheidende Erkenntnis ist, dass ptr1 < ptr2 dir sagt, dass ptr1 auf ein Element zeigt, das im Array vor dem Element steht, auf das ptr2 zeigt. Diese Beziehung macht den Vergleich von Zeigern zu einer natürlichen Wahl für die Steuerung von Schleifen, die Arrays der Reihe nach verarbeiten.
Aufgabe
EinfachSchreibe ein C-Programm, das einen Array mithilfe von Zeigervergleichen durchläuft und Elemente innerhalb eines bestimmten Bereichs findet. Dein Programm soll:
- Ein Integer-Array namens
scoresmit 8 Elementen deklarieren und mit den Werten {45, 78, 92, 63, 87, 34, 91, 56} initialisieren - Zwei Zeiger auf Integer deklarieren:
start_ptrundend_ptr start_ptrso setzen, dass er auf das erste Element des Arrays zeigtend_ptrmithilfe von Zeigerarithmetik so setzen, dass er auf das letzte Element des Arrays zeigt- Einen Zeiger namens
current_ptrdeklarieren und so initialisieren, dass er auf das erste Element zeigt - Das Array mit einer while-Schleife und einem Zeigervergleich (
current_ptr <= end_ptr) durchlaufen - Innerhalb der Schleife:
- Prüfen, ob der aktuelle Wert zwischen 60 und 90 (einschließlich) liegt
- Wenn der Wert im Bereich liegt, genau
Value [value] is in rangeausgeben - Wenn der Wert nicht im Bereich liegt, genau
Value [value] is out of rangeausgeben current_ptrinkrementieren, um zum nächsten Element zu gelangen
- Nach der Schleife mithilfe eines Zeigervergleichs überprüfen, ob
current_ptrnun hinter dem Ende des Arrays liegt, indem geprüft wird, obcurrent_ptr > end_ptr - Wenn die Bedingung wahr ist, genau
Traversal completeausgeben
Deine Ausgabe sollte die Ergebnisse im folgenden Format anzeigen:
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 completeDiese Herausforderung testet dein Verständnis von Zeigervergleichsoperatoren in Schleifenbedingungen, der Verwendung von Zeigerarithmetik zum Festlegen von Grenzzeigern und der Frage, wie Zeigervergleiche das Durchlaufen eines Arrays eleganter steuern können als herkömmliche zählerbasierte Schleifen.
Probier es selbst
#include <stdio.h>
int main() {
// TODO: Schreibe deinen Code unten
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Ablauf
1Zeiger-Grundlagen
Was ist ein Zeiger?Zeiger deklarierenDer Adressoperator (&)Der Dereferenzierungsoperator (*)NULL-ZeigerZusammenfassung: Zeiger-Grundlagen4Projekt: Einfaches Text-Tool
ProjektübersichtZeichen zählen2Pointer und Arrays
Array-Namen als PointerArray-Elemente - PointerPointer-ArithmetikPointer vergleichenWiederholung: Array-Durchlauf mit Pointern5Zeiger und Funktionen
Wertübergabe (Pass-by-Value)Zeiger an Funktionen übergebenVariablen über Zeiger ändernEin klassisches Beispiel: SwapArrays an Funktionen übergebenZusammenfassung: Zeiger als Funktionsargumente8Structs und Zeiger
Zeiger auf StructsDer Pfeiloperator (->)Structs per Wert übergebenÜbergabe von Struct-ZeigernDynamische Allokation von StructsZusammenfassung: Struct ändern - Ptr11Finale Wiederholungsaufgaben
Wiederholung: Dynamische String-KonkatenationWiederholung: Array von StructsWiederholung: Wortfrequenz-Zähler3Character-Arrays und Strings
Strings als char-ArraysDer Null-TerminatorString-Eingabe mit scanfVerwendung von strlen()Verwendung von strcpy()Verwendung von strcat()Verwendung von strcmp()Zusammenfassung: Grundlegende String-FunktionenÜbe selbstständig: Online-C-Compiler