Funktionen, 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
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
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
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
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
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.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
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
Funktionen, 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
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
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
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
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
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.
Danke für Ihr Feedback!