Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Funktionen, Arrays und Zwei Zeiger | Zeiger
C-Grundlagen

bookFunktionen, Arrays und Zwei Zeiger

Funktionen mit Zeigern

Untersuchen wir eine grundlegende Funktion, um den Wert unserer Daten zu ändern. Stellen Sie sich beispielsweise vor, Sie benötigen eine Funktion, die Kilo-Ohm in Ohm umwandelt (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Ein Versuch, den Wert der Variablen r zu ändern, war erfolglos. Dies liegt daran, dass die Funktion eine Kopie der Variablen r erhält und nicht den tatsächlichen Wert selbst.

Damit unser Programm wie beabsichtigt funktioniert, müssen Sie die Adresse der Variablen r an die Funktion übergeben. Folglich sollte die Funktion Ohm ein double* anstelle eines einfachen double akzeptieren.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Beachten Sie, dass die Variable r zweimal referenziert wird. Nach dem Aufruf der Funktion Ohm wird der Wert von r verändert. Dies liegt daran, dass die Funktion die ursprüngliche Adresse der Variablen r erhalten hat, nicht nur eine Kopie, und dann den Wert an dieser Adresse modifiziert hat.

Außerdem kann eine Funktion einen Zeiger auf ein von ihr erzeugtes Objekt zurückgeben:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Wenn eine Zahl (pX + 1) zu einer Adresse addiert wird, ergibt sich die Adresse der nachfolgenden Speicherzelle! Lassen Sie uns eine Schleife schreiben, um die "Sequenz" des RAM zu durchlaufen:

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Sie haben drei Schritte vorausgedacht. Aus den abgeleiteten Adressen wird deutlich, dass eine klare Hierarchie besteht.

Ein Array ist im Wesentlichen eine feste Adresse (repräsentiert durch den Namen des Arrays) in Verbindung mit reserviertem Speicher. Die Indizes der Elemente stellen ihren Offset von der Adresse des ersten Elements dar!

Dieses Konzept lässt sich mit dem folgenden Programm überprüfen:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Das Array wird nicht direkt durchlaufen. Es wird ausschließlich seine Adresse verwendet, insbesondere die Adresse des ersten Elements.

question mark

Welche Aussage erklärt am besten, warum eine Funktion in C den Wert einer Variablen ändern kann, wenn ihr ein Zeiger darauf übergeben wird, aber nicht, wenn die Variable selbst übergeben wird?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 6. Kapitel 5

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

Can you explain how passing by address works in more detail?

What are some common mistakes when using pointers in functions?

Can you show an example of pointer arithmetic in a loop?

Awesome!

Completion rate improved to 2.63

bookFunktionen, Arrays und Zwei Zeiger

Swipe um das Menü anzuzeigen

Funktionen mit Zeigern

Untersuchen wir eine grundlegende Funktion, um den Wert unserer Daten zu ändern. Stellen Sie sich beispielsweise vor, Sie benötigen eine Funktion, die Kilo-Ohm in Ohm umwandelt (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Ein Versuch, den Wert der Variablen r zu ändern, war erfolglos. Dies liegt daran, dass die Funktion eine Kopie der Variablen r erhält und nicht den tatsächlichen Wert selbst.

Damit unser Programm wie beabsichtigt funktioniert, müssen Sie die Adresse der Variablen r an die Funktion übergeben. Folglich sollte die Funktion Ohm ein double* anstelle eines einfachen double akzeptieren.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Beachten Sie, dass die Variable r zweimal referenziert wird. Nach dem Aufruf der Funktion Ohm wird der Wert von r verändert. Dies liegt daran, dass die Funktion die ursprüngliche Adresse der Variablen r erhalten hat, nicht nur eine Kopie, und dann den Wert an dieser Adresse modifiziert hat.

Außerdem kann eine Funktion einen Zeiger auf ein von ihr erzeugtes Objekt zurückgeben:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Wenn eine Zahl (pX + 1) zu einer Adresse addiert wird, ergibt sich die Adresse der nachfolgenden Speicherzelle! Lassen Sie uns eine Schleife schreiben, um die "Sequenz" des RAM zu durchlaufen:

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Sie haben drei Schritte vorausgedacht. Aus den abgeleiteten Adressen wird deutlich, dass eine klare Hierarchie besteht.

Ein Array ist im Wesentlichen eine feste Adresse (repräsentiert durch den Namen des Arrays) in Verbindung mit reserviertem Speicher. Die Indizes der Elemente stellen ihren Offset von der Adresse des ersten Elements dar!

Dieses Konzept lässt sich mit dem folgenden Programm überprüfen:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

Das Array wird nicht direkt durchlaufen. Es wird ausschließlich seine Adresse verwendet, insbesondere die Adresse des ersten Elements.

question mark

Welche Aussage erklärt am besten, warum eine Funktion in C den Wert einer Variablen ändern kann, wenn ihr ein Zeiger darauf übergeben wird, aber nicht, wenn die Variable selbst übergeben wird?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 6. Kapitel 5
some-alt