Ich lerne gerade C und stoße jetzt auf eine Mauer. Es ist schwierig für mich, Zeiger zu verstehen.
Stellen Sie sich vor, ich habe diesen Code:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define DELTA 33
int calls, seed=356;
int sum_ds(int a){
int d=DELTA;
calls++;
return a+d+seed;
}
int main() {
int num;
int *ptr;
int **handle;
num = 14;
ptr = (int *)malloc(2 * sizeof(int));
handle = &ptr;
*(*handle+0) = num;
*(*handle+1) = num+1;
*ptr = num-2;
ptr = #
*ptr = sum_ds(num-2);
}
Lassen Sie uns Schritt für Schritt durch mein Verständnis gehen.
1 - int calls erstellt eine Variable namens calls und initialisiert sie nicht, so dass sie Müll enthält. Sie wird auf DATA und sagen wir mit der Speicheradresse 0xFFAA gespeichert.
2 - int seeds erzeugt eine Variable namens seeds, die mit der ganzen Zahl 356 initialisiert wird. Sie wird auf DATA gespeichert, und zwar mit der Speicheradresse 0xFFAB.
3 - int num erstellt eine Variable namens num und initialisiert sie nicht, so dass sie Müll enthält. Sie wird auf dem STACK gespeichert, und zwar mit der Speicheradresse 0xFFAC.
4 - int *ptr erzeugt einen Zeiger auf int und weist ihm keine Adresse zu. Er wird auf dem STACK gespeichert, sagen wir mit der Speicheradresse 0xFFAD.
5 - int **handle erzeugt einen Zeiger auf einen Zeiger von int und weist ihm keine Adresse zu. Er wird auf dem STACK gespeichert, sagen wir mit der Speicheradresse 0xFFAE. (VIELE ZWEIFEL HIER)
6 - num = 14 geht zur Adresse 0xFFAC und speichert dort die Zahl 14. Das geschieht im STACK.
7 - ptr = (int *)malloc(2 * sizeof(int)) Auf dem HEAP wird eine Speichergröße für 2 Ints zugewiesen und die Adresse des ersten Speicherbytes (sagen wir 0xFFZZ) wird (auf STACK) auf ptr gespeichert, so dass *ptr nun auf diese Speicheradresse zeigt.
8 - handle = &ptr handle zeigt jetzt auf ptr. Ich glaube, es zeigt jetzt auf das, was auf 0xFFZZ steht (VIELE ZWEIFEL HIER)
9 - *(*handle+0) = num der Zeiger auf den Zeiger von int, dem jetzt der Wert von num zugewiesen ist (14) (VIELE VIELE VIELE VIELE DUBELS HIER)
10 - *(*handle+1) = num+1 der Zeiger von pointer plus einer von int wird nun mit dem Wert von num + 1 belegt (15) (VIELE VIELE VIELE VIELE DUBELS HIER)
11 - *ptr = num-2 der Wert Punkt von ptr wird mit dem Wert von num - 2 (12) zugewiesen. Ich glaube, es geht an die Speicheradresse 0xFFZZ und speichert dort die Zahl 12.
12 - ptr = &num ptr zeigt jetzt auf num, ich glaube es zeigt jetzt auf 0xFFAC.
13 - *ptr = sum_ds(num-2) der Wert, auf den ptr zeigt, ist der zurückgegebene Wert von sum_ds. Ich glaube 0xFFAC wird mit 401 (12+33+356) zugewiesen.
Ist das richtig?