Arrays an Funktionen übergeben
Teil des Abschnitts Logic & Flow der C-Journey von Coddy — Lektion 29 von 63.
Wenn Sie ein Array an eine Funktion in C übergeben, passiert hinter den Kulissen etwas Interessantes. Das Array selbst wird nicht wirklich an die Funktion kopiert. Stattdessen wird ein Zeiger auf das erste Element des Arrays übergeben.
Das bedeutet, dass wenn Sie einen Funktionsparameter wie int arr[] oder int *arr schreiben, beide gleichwertig sind – beide stellen einen Zeiger auf das erste Element des Arrays dar. Die Funktion erhält die Speicheradresse, an der das Array beginnt, was ihr direkten Zugriff auf die Daten des ursprünglichen Arrays ermöglicht.
void printArray(int arr[], int size) {
// arr ist eigentlich ein Zeiger auf das erste Element
// Die Funktion kann auf das ursprüngliche Array zugreifen und es ändern
}Da die Funktion mit dem Speicherort des ursprünglichen Arrays arbeitet und nicht mit einer Kopie, wirken sich alle innerhalb der Funktion vorgenommenen Änderungen auf das ursprüngliche Array aus. Dies unterscheidet sich von der Übergabe einzelner Variablen, bei der Kopien erstellt werden.
Sie werden auch feststellen, dass Sie die Größe des Arrays als separaten Parameter übergeben müssen, da die Funktion die Länge des Arrays nicht allein aus dem Pointer bestimmen kann.
Aufgabe
EinfachSchreiben Sie ein C-Programm, das die Übergabe von Arrays an Funktionen demonstriert, indem Sie eine Funktion erstellen, die Temperaturdaten verarbeitet. Ihr Programm sollte:
- Erstellen Sie eine Funktion namens
analyzeTemperatures, die ein Integer-Array und dessen Größe als Parameter entgegennimmt - Berechnen und geben Sie innerhalb der Funktion
analyzeTemperaturesdie Durchschnittstemperatur mit genau einer Dezimalstelle im FormatAverage temperature: [value]aus - Finden und geben Sie innerhalb der Funktion
analyzeTemperaturesdie höchste Temperatur im FormatHighest temperature: [value]aus - Zählen Sie innerhalb der Funktion
analyzeTemperatures, wie viele Temperaturen über 25 Grad liegen, und geben Sie die Anzahl im FormatDays above 25 degrees: [count]aus - Lesen Sie in der Funktion
maineine Ganzzahlnein, die die Anzahl der Temperaturmessungen darstellt - Lesen Sie
nTemperaturwerte ein und speichern Sie diese in einem Integer-Array - Rufen Sie die Funktion
analyzeTemperaturesauf und übergeben Sie das Array und seine Größe
Ihr Programm sollte die Temperaturdaten verarbeiten und die Analyseergebnisse anzeigen. Wenn die Eingabe zum Beispiel wie folgt aussieht:
5
20 28 15 32 26Ihre Ausgabe sollte wie folgt aussehen:
Average temperature: 24.2
Highest temperature: 32
Days above 25 degrees: 3Diese Herausforderung zeigt, wie Arrays als Zeiger auf ihr erstes Element an Funktionen übergeben werden, sodass die Funktion auf alle Elemente des ursprünglichen Arrays zugreifen und diese verarbeiten kann, ohne eine Kopie zu erstellen.
Spickzettel
Beim Übergeben von Arrays an Funktionen in C wird das Array selbst nicht kopiert. Stattdessen wird ein Zeiger auf das erste Element übergeben.
Sowohl int arr[] als auch int *arr sind gleichwertige Funktionsparameter – sie repräsentieren einen Zeiger auf das erste Element:
void printArray(int arr[], int size) {
// arr ist eigentlich ein Zeiger auf das erste Element
// Die Funktion kann auf das ursprüngliche Array zugreifen und es ändern
}Wichtige Punkte:
- Funktionen erhalten die Speicheradresse, an der das Array beginnt
- Innerhalb der Funktion vorgenommene Änderungen wirken sich auf das ursprüngliche Array aus
- Die Array-Größe muss als separater Parameter übergeben werden, da die Funktion die Länge nicht allein aus dem Zeiger bestimmen kann
Probier es selbst
#include <stdio.h>
// TODO: Erstellen Sie hier die Funktion analyzeTemperatures
int main() {
// Anzahl der Temperaturmessungen einlesen
int n;
scanf("%d", &n);
// Array zum Speichern der Temperaturen deklarieren
int temperatures[n];
// Temperaturwerte einlesen
for (int i = 0; i < n; i++) {
scanf("%d", &temperatures[i]);
}
// TODO: Rufen Sie hier die Funktion analyzeTemperatures auf
return 0;
}Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logic & Flow
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